我有以下型号,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记录。
任何指示如何实现这一点将不胜感激!
谢谢,
马丁
答案 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')
)
现在我们可以说
“查询将仅包含艺术作品 在注释的日期范围内 总和“。