我有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')