2

我有以下模型,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 记录。

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

谢谢,

马丁

4

1 回答 1

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')
)

现在我们可以说

“查询将只包括注释总和中日期范围内的艺术分数。”

于 2009-11-13T16:48:43.857 回答