django:基于时间范围的聚合查询

时间:2009-11-13 13:34:03

标签: django django-models aggregate django-queryset django-aggregation

我有以下型号,Art和ArtScore:

class Art(models.Model):
    title = models.CharField()

class ArtScore(models.Model):
    art = models.ForeignKey(Art)
    date = models.DateField(auto_now_add = True)
    amount = models.IntegerField()

某些用户操作会导致ArtScore条目,例如,当您点击“我喜欢这种艺术品”时,我会为该艺术品保存一定数量的ArtScore。

现在我正在尝试显示“本周最受欢迎”的网页,因此我需要一个仅汇总该时间范围的ArtScore金额的查询。

我构建了以下查询,但它存在缺陷......

popular = Art.objects.filter(
    artscore__date__range=(weekago, today)
).annotate(
    score=Sum('artscore__amount')
).order_by('-score')

...因为它仅排除了在日期范围内没有ArtScore记录的Art,但不排除日期范围之外的ArtScore记录。

任何指示如何实现这一点将不胜感激!

谢谢,

马丁

1 个答案:

答案 0 :(得分:4)

看起来像这样: http://docs.djangoproject.com/en/dev/topics/db/aggregation/#order-of-annotate-and-filter-clauses你所拥有的应该做你想做的事。文件错了吗?可能是错误的?

  

“第二个查询仅包括   注释中的好书。“

关于:

>>> Publisher.objects.filter(book__rating__gt=3.0).annotate(num_books=Count('book'))

将此更改为您的查询(暂时忘记订单):

Art.objects.filter(
    artscore__date__range=(weekago, today)
).annotate(
    score=Sum('artscore__amount')
)

现在我们可以说

  

“查询将仅包含艺术作品   在注释的日期范围内   总和“。