首页 > 解决方案 > 如何在模型或过滤器中存储多多域的计数并聚合多多域

问题描述

我有一个模型,我想在其中创建一个多字段计数的排名。只有它需要一个整数字段而不是多对多字段。我的投票有问题__lt。

最好的做法是创建一个 votes_count 整数字段来计算选票,还是有办法修复此代码以使其正常工作?

class ContestEntry(TimeStampedModel):
   votes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='vote_entry')

   def ranking(self):
        aggregate = ContestEntry.objects.filter(votes__lt=Count(self.votes)).aggregate(ranking=Count('votes'))
        return aggregate['ranking'] + 1

标签: djangomanytomanyfield

解决方案


您可以.annotate为此使用:

def ranking(self):
    return ContestEntry.objects.annotate(
        nvotes=Count('votes')
    ).filter(
        nvotes__gt=self.votes.all().count()
    ).count()

ContestEntry因此,在这里我们首先用投票数来注释s nvotes,然后我们计算有多少ContestEntrysnvotes超过了self对象的投票数。


推荐阅读