Django过滤器返回重复的值



我有Post模型与Vote模型以一对多关系链接。当我尝试筛选票数最多的帖子时,.filter()返回的帖子与它收到的票数一样多我试着去理解&使用类似问题中推荐的.distinct()函数,但它不起作用。

这是邮政模型:

class Post(models.Model):
text = models.CharField(max_length=450)
posted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True)
posted_at = models.DateTimeField(editable=False, default=timezone.now)
status = models.CharField(choices=status, default='PENDING', max_length=15)
def __str__(self):
return self.text

&投票模式:

class Vote(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
post = models.ForeignKey('Post', on_delete=models.CASCADE)
def __str__(self):
return f'{str(self.user)} - {str(self.post)}'

views.py:

class PostsView(TemplateView):
template_name = 'posts.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['most_voted_posts'] = Post.objects.filter(status='PUBLISHED').order_by('-vote')
return context

您需要首先使用Count用投票数对查询集中的每个Post进行注释,在普通/未筛选的查询集上使用此注释不应产生重复。然后您可以通过以下注释订购:

from django.db.models import Count
Post.objects.annotate(num_votes=Count('vote')).order_by('-num_votes')

最新更新