我正在构建一个网络应用程序,允许教授为学生输入作业,如果你愿意,还可以输入一个交互式教学大纲。课程页面的其中一个部分显示了进度。
我已经构建了一个饼图组件,我想填充数据:
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)
答案 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;到子查询的地方。