首页 > 解决方案 > Django过滤器返回重复值

问题描述

我有Post模型与Vote模型以一对多的关系链接。当我尝试过滤具有最多票数的帖子时,.filter()返回的帖子与收到的票数一样多,我试图理解和使用.distinct()类似问题中推荐的功能,但事实证明它不起作用。

这是 Post 模型:

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)}'

视图.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

标签: django

解决方案


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

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

推荐阅读