如何在模型或过滤器中存储多菌落域的计数并汇总多菌落域

问题描述

我有一个模型,我想在该模型中为多方域的计数创建排名。只有它期望整数字段而不是多位数字段。我的票有问题__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

解决方法

您可以为此使用.annotate

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

因此,我们在这里首先用投票数ContestEntry注释nvotes,然后计算有多少ContestEntry的{​​{1}}票数nvotes对象的投票数。