如何在模型或过滤器中存储 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
对象的投票数。
我有一个模型,我想在其中为多对多字段的计数创建排名。只有它需要一个整数字段而不是 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
对象的投票数。