【问题标题】:django: time range based aggregate querydjango:基于时间范围的聚合查询
【发布时间】:2010-12-16 07:10:40
【问题描述】:

我有以下模型,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 记录的艺术,但不排除日期范围外的 ArtScore 记录。

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

谢谢,

马丁

【问题讨论】:

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


    【解决方案1】:

    它看起来像这样: 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')
    )
    

    现在我们可以说

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

    【讨论】:

      猜你喜欢
      • 2016-10-09
      • 1970-01-01
      • 2016-12-02
      • 2012-09-18
      • 2021-05-20
      • 1970-01-01
      • 2012-04-14
      • 2021-08-20
      • 2018-02-20
      相关资源
      最近更新 更多