按相关模型的属性对queryset排序,另一个属性等于

时间:2019-07-16 22:38:24

标签: python django

假设我有这种模型关系:

class Account(models.model):
   ...

class Balance(models.Model):
    class Meta:
       verbose_name = u"Balance"
       verbose_name_plural = u"Balances"

    name = models.CharField(max_length=200, verbose_name=u"Currency", null=True, blank=True)
    count = models.FloatField(verbose_name=u"Count", null=True, blank=True)
    account = models.ForeignKey(Account, verbose_name='Account', on_delete=models.CASCADE, null=True, blank=True)

    def __str__(self):
       return self.name

我有一个queryset帐户,它们都具有相同的余额数量,并且余额具有相同的名称,但计数却不同。例如,我有3个帐户,每个帐户只有2个相关余额,名称分别为“ foo”和“ bar”,但这些余额中的“ count”属性可能有所不同。如何通过名称为“ foo”的余额的“ count”属性订购帐户?

如果可能的话,我想为这个问题寻求解决方案,但是尽管我已经为此使用了过滤器,但还是进行了过滤,所以它并不是那么重要。

1 个答案:

答案 0 :(得分:1)

如果每个帐户都有一个名为'foo'的余额,则可以用foo余额的总和来注释查询集,然后按该顺序对查询集进行排序

from django.db.models import Q, Sum

qs = Account.objects.all().annotate(
    foo_count=Sum('balances__count', filter=Q(balances__name='foo'))
).order_by('-foo_count')