在django中使用values()和Count()时包含0个值

时间:2015-03-11 21:10:28

标签: python django

我不太确定如何说出这个问题。

我正在尝试在django中创建一个方法,该方法根据对象的创建日期查询对象。我打算使用这些数据来生成图表。

到目前为止,我正在使用它:

query.extra(select={"day": "DATE(created_at)"}).values('day').annotate(models.Count("id"))

鉴于每天至少有1次,这是完美的。如果没有每天1,它会跳过我图表中的那一天。

如果可能的话,我想避免日复一日地循环。这种方法需要几天时间。

是否有一种简单的方法可以修改它,以便在给定的一天中有0个对象时包含? 什么是最好的方法呢?

2 个答案:

答案 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