Django按foreignkey分组,按另一个字段的和过滤

Django按foreignkey分组,按另一个字段的和过滤,django,django-models,django-queryset,Django,Django Models,Django Queryset,鉴于模型: class Bid(models.Model): account = models.ForeignKey('accounts.Account', related_name="bids") tokens = models.IntegerField(default=0) 我希望能够做两件事 获取每个帐户的令牌总数 根据帐户的令牌总数筛选帐户 因为我希望能够以其他方式动态过滤结果,所以最好能得到一个我可以继续过滤的查询集。提前感谢。您可以使用annotate()。从Dja

鉴于模型:

class Bid(models.Model):
    account = models.ForeignKey('accounts.Account', related_name="bids")
    tokens = models.IntegerField(default=0)
我希望能够做两件事

  • 获取每个帐户的令牌总数
  • 根据帐户的令牌总数筛选帐户
  • 因为我希望能够以其他方式动态过滤结果,所以最好能得到一个我可以继续过滤的查询集。提前感谢。

    您可以使用
    annotate()。从Django文档:

    可以使用
    annotate()
    子句生成每个对象的摘要指定
    annotate()
    子句时,
    QuerySet
    中的每个对象都将使用指定的值进行注释。

    aggregate()
    不同,
    annotate()
    不是终止子句注释()子句的输出是一个查询集;可以使用任何其他查询集操作修改此查询集,包括
    filter()
    order\u by()
    ,甚至对
    annotate()
    的附加调用

    参考您的示例,您应该能够使用以下方法筛选令牌总数>=100的帐户:


    很好,如果你有时间的话,有一个变体,如果我从投标对象的一个子集开始,想做同样的过程,但只使用投标对象的那个子集来获取总金额呢?听起来你可以从那
    投标
    子集中抓取相关的
    帐户
    s,然后执行上面的
    .annotate().filter()
    --您可能需要使用
    .distinct()
    来防止queryset中出现重复帐户。尝试:
    bid\u subset.account.distinct().annotate(…).filter(…)
    from django.db.models import Sum
    
    # every Account in the Queryset will have an extra attribute called sum_tokens
    qs1 = Account.objects.annotate(sum_tokens=Sum('bids__tokens'))
    
    # annotate returns a QuerySet so you can continue to filter it
    qs2 = qs1.filter(sum_tokens__gte=100)
    
    # combine the above two to get what you need
    qs = Account.objects.annotate(sum_tokens=Sum('bids__tokens')).filter(sum_tokens__gte=100)