如何在模型或过滤器中存储 manytomanyfield 的计数并聚合 manytomanyfield

How do I store a count of a manytomanyfield in a model or filter and aggregate a manytomanyfield

我有一个模型,我想在其中为多对多字段的计数创建排名。只有它需要一个整数字段而不是 manytomany 字段。 votes__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(
        <b>nvotes__gt=self.votes.all().count()</b>
    ).count()

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