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)