我正在建立一个网络应用程序,让教授可以输入作业供学生遵循,如果你愿意的话,一个互动的教学大纲。课程页面的一个部分显示进度。
我已经构建了一个饼图组件,我想用数据填充它:
pie_chart(
title, # name of chart
percent, # percentage of assignments completed
count, # how many assignments completed
total # how many assignments total
)
我正在使用Peewee从我的赋值表中检索这些数据:
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)
发布于 2014-12-18 12:27:21
我认为您的问题是您的子查询返回多行-您应该在子查询的位置中添加'and a.type_id = t.id‘。
发布于 2014-12-15 05:53:34
关于python中的日期,特别是peewee,最重要的一点是,您可以非常直观地比较它们。幕后日期通常表示为自1970年某个日期以来的秒数。下面是一个使用peewee按日期查询的示例:
today = datetime.today()
query = Tweet.update(is_published=True).where(Tweet.creation_date < today)
query.execute()
在这个例子中,Tweet
类只是一个布尔is_published
属性和一个datetime creation_date
属性。
与您的例子更接近的是:
today = datetime.today()
query = Assignment.select().where(Assignment.due_date < today)
但我会尽量不给出完全的答案。
希望这能帮上忙,如果你有什么问题请告诉我。
发布于 2014-12-15 19:17:38
如果您现在在python值中没有方便的地方(而且您正在使用sqlite),那么您可以使用fn.date('now')
来获取今天的数据。MySQL或Postgresql也存在类似的函数。
https://stackoverflow.com/questions/27478109
复制相似问题