Django按日期获取行数

时间:2014-12-13 14:59:50

标签: django django-models django-queryset

我一直在仔细研究这个问题,看了很多stackoverflow问题并经历了aggregation docs 我需要获取按日期分组的PropertyImpressions数据集。这是PropertyImpression模型:

#models.py
class PropertyImpression(models.Model):
    '''
    Impression data for Property Items
    '''
    property = models.ForeignKey(Property, db_index=True)
    imp_date = models.DateField(auto_now_add=True)

我已经尝试了很多视图代码的变体,但是我发布这段代码是因为我认为它是最符合逻辑的简单代码,根据文档和示例,我应该按照我的目的去做。< / p>

#views.py
def admin_home(request):
    '''
    this is the home dashboard for admins, which currently just means staff.
    Other users that try to access this page will be redirected to login.
    '''
    prop_imps = PropertyImpression.objects.values('imp_date').annotate(count=Count('id'))

    return render(request, 'reportcontent/admin_home.html', {'prop_imps':prop_imps})

然后在模板中使用{{prop_imps}}变量时,它会给我一个PropertyImpressions列表,但是按imp_date和property分组。我需要这个只按imp_date分组,并根据values docs添加.values('imp_date'),它只是按该字段分组?

当它离开prop_imps变量中的.annotate时,它会给我一个所有imp_dates的列表,这个列表非常接近,但是当我按日期字段对它进行分组时,由于imp_date和属性而出于某种原因组。

1 个答案:

答案 0 :(得分:2)

也许您已在PropertyImpression模型中定义了默认排序?

在这种情况下,您应该在注释之前添加 order_by()来重置它:

prop_imps = PropertyImpression.objects.values('imp_date').order_by() \
                                      .annotate(count=Count('id'))

它是explained in Django documentation here

在选择输出数据时,将使用在查询集的order_by()部分中提及的字段(或在模型的默认排序中使用的字段),即使它们未在值中另行指定()打电话。这些额外字段用于将“喜欢”结果组合在一起,并且它们可以使其他相同的结果行看起来是分开的。特别是在计算事物时会出现这种情况。