首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >利用Peewee ORM生成图的数据

利用Peewee ORM生成图的数据
EN

Stack Overflow用户
提问于 2014-12-15 05:49:06
回答 3查看 243关注 0票数 2

我正在建立一个网络应用程序,让教授可以输入作业供学生遵循,如果你愿意的话,一个互动的教学大纲。课程页面的一个部分显示进度。

我已经构建了一个饼图组件,我想用数据填充它:

代码语言:javascript
运行
复制
pie_chart(
    title, # name of chart
    percent, # percentage of assignments completed
    count, # how many assignments completed
    total # how many assignments total
)

我正在使用Peewee从我的赋值表中检索这些数据:

代码语言:javascript
运行
复制
class Type(BaseModel):
    name = CharField() # Homework, Test, Final, etc.

class Assignment(BaseModel):
    name = CharField()
    due_date = DateField()
    type = ForeignKeyField(Type)
    course = ForeignKeyField(Course)

我需要数据库中的以下内容,我不知道如何用Peewee完成它。知道名字和总数应该很简单。但是我需要把due_date和今天的日期进行比较,看看有多少作业已经完成。

姓名合计已完成

期末2 0家庭作业23 12考试4 2

如果重要的话,我的饼图输出将会是这样的:

代码语言:javascript
运行
复制
Homework
|XXX-------|
3 of 10 complete

更新

我有一个查询,它可以完成我所需要的几乎所有事情。其他人能帮我把它拿走吗?

以下是查询:

代码语言:javascript
运行
复制
select t.name,
        count(a.type_id) as total,
        (
            select count(id)
            from assignment a
            where a.course_id = 7
            and a.user_id = 3
            and a.due_date < date()
            group by a.type_id
            order by a.type_id
        ) as completed
from assignment a
inner join type t on t.id = a.type_id
where a.course_id = 7
and a.user_id = 3
group by a.type_id
order by a.type_id

下面是使用以下示例数据的结果:

代码语言:javascript
运行
复制
Homework, 8, 6
Test, 4, 6
Final, 2, 6

这是非常接近的,但是我希望完整的列是特定于赋值类型的。

下面是赋值表中的一些示例数据

代码语言:javascript
运行
复制
id name
------------------------
9, Chapter 1, 2014-11-01
10, Chapter 2, 2014-11-08
11, Test on chapter 1-2, 2014-11-15
12, Chapter 3, 2014-11-19
13, Chapter 4, 2014-11-22
14, Test on chapter 3-4, 2014-11-25
15, Midterm - Chapter 1-4, 2014-11-25
16, Chapter 5, 2014-11-25
17, Chapter 6, 2014-11-25
18, Test on chapter 5-6, 2014-11-25
19, Chapter 7, 2015-01-09
20, Chapter 8, 2015-01-11
21, Test on chapter 7-8, 2015-01-13
22, Final - Chapter 1-8, 2015-01-15

以下是我目前能想到的最好的办法。我正在对“已完成”列进行硬编码,因为我无法正确地完成它:

代码语言:javascript
运行
复制
Assignment.select(
    Type.name,
    fn.Lower('1').alias('completed'),
    fn.Count(Type.id).alias('total'),
).join(Type).where(
    Assignment.course==self,
).group_by(Type.id).order_by(Type.id)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-18 12:27:21

我认为您的问题是您的子查询返回多行-您应该在子查询的位置中添加'and a.type_id = t.id‘。

票数 1
EN

Stack Overflow用户

发布于 2014-12-15 05:53:34

关于python中的日期,特别是peewee,最重要的一点是,您可以非常直观地比较它们。幕后日期通常表示为自1970年某个日期以来的秒数。下面是一个使用peewee按日期查询的示例:

代码语言:javascript
运行
复制
today = datetime.today()
query = Tweet.update(is_published=True).where(Tweet.creation_date < today)
query.execute()

在这个例子中,Tweet类只是一个布尔is_published属性和一个datetime creation_date属性。

与您的例子更接近的是:

代码语言:javascript
运行
复制
today = datetime.today()
query = Assignment.select().where(Assignment.due_date < today)

但我会尽量不给出完全的答案。

希望这能帮上忙,如果你有什么问题请告诉我。

票数 1
EN

Stack Overflow用户

发布于 2014-12-15 19:17:38

如果您现在在python值中没有方便的地方(而且您正在使用sqlite),那么您可以使用fn.date('now')来获取今天的数据。MySQL或Postgresql也存在类似的函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27478109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档