我不太确定如何说出这个问题。
我正在尝试在django中创建一个方法,该方法根据对象的创建日期查询对象。我打算使用这些数据来生成图表。
到目前为止,我正在使用它:
query.extra(select={"day": "DATE(created_at)"}).values('day').annotate(models.Count("id"))
鉴于每天至少有1次,这是完美的。如果没有每天1,它会跳过我图表中的那一天。
如果可能的话,我想避免日复一日地循环。这种方法需要几天时间。
是否有一种简单的方法可以修改它,以便在给定的一天中有0个对象时包含? 什么是最好的方法呢?
答案 0 :(得分:2)
我建议只使用django查询从数据库中获取数据,然后就可以处理它了。
所以,我会这样:
import datetime
def daterange(start_date, end_date):
"""
Generate an iterator of dates between the two given dates.
taken from http://stackoverflow.com/questions/1060279/
"""
for n in range(int ((end_date - start_date).days)):
yield start_date + datetime.timedelta(n)
def get_graph_data(start_date, end_date):
query = MyModel.objects.all().annotate(models.Count("id"))
data = query.values('created_at', 'id__count')
# go through all the dates between start_date and end_date
# and fill the missing gaps with 0
return dict((d, data[d] if d in data else 0) for d in daterange(t, to))
答案 1 :(得分:1)
对我来说,这听起来更像是图表的问题,而不是查询级别的问题。但是,如果您真的想在查询级别上解决此问题,则需要执行类似于此处generate days from date range给出的答案。这将是丑陋的。也许在python级别解决这个问题?有关python解决方案的更多信息Generate a list of datetimes between an interval in python