使用Peewee ORM生成图形数据

时间:2014-12-15 05:49:06

标签: python sql orm peewee

我正在构建一个网络应用程序,允许教授为学生输入作业,如果你愿意,还可以输入一个交互式教学大纲。课程页面的其中一个部分显示了进度。

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

pie_chart(
    title, # name of chart
    percent, # percentage of assignments completed
    count, # how many assignments completed
    total # how many assignments total
)

我正在使用Peewee ORM从我的作业表中检索这些数据:

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

如果重要的话,我的饼图输出看起来像这样:

Homework
|XXX-------|
3 of 10 complete

更新

我的查询几乎可以完成我需要的一切。任何人都可以帮助我完成余下的工作吗?

以下是查询:

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

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

Homework, 8, 6
Test, 4, 6
Final, 2, 6

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

以下是“分配表”中的一些示例数据

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

以下是我现在能想到的最好的。我正在硬编码“完成”专栏,因为我无法做到正确:

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)

3 个答案:

答案 0 :(得分:1)

关于python日期的好处,尤其是peewee,你可以用非常直观的方式比较它们。幕后日期通常表示为自1970年某个日期以来的秒数。以下是使用peewee按日期查询的示例:

today = datetime.today()
query = Tweet.update(is_published=True).where(Tweet.creation_date < today)
query.execute()

在此示例中,Tweet类只是一个具有布尔is_published属性和日期时间creation_date属性的类。

更接近你的例子的是:

today = datetime.today()
query = Assignment.select().where(Assignment.due_date < today)

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

希望有所帮助,如果您有任何问题,请与我联系。

答案 1 :(得分:1)

如果您今天没有使用python值(并且您正在使用sqlite),那么今天就可以使用fn.date('now')获取。 MySQL或Postgresql也存在类似的功能。

答案 2 :(得分:1)

我认为您的问题是您的子查询返回多行 - 您应该添加&#39;和a.type_id = t.id&#39;到子查询的地方。