django - 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
解决方案
您需要首先使用Post
投票数在查询集中注释每个,在Count
普通/非过滤查询集上使用此注释不应产生重复。然后您可以通过此注释订购:
from django.db.models import Count
Post.objects.annotate(num_votes=Count('vote')).order_by('-num_votes')
推荐阅读
- r - 在数据框的每一列上调用类似 R 的函数,并将剩余的列作为参数?
- python - 专业化多处理。池工作者
- python - 根据列表条件分配新的 DataFrame 列
- c++ - 如何将一些计算值包装在一个范围内以允许在变换的输出上使用连接?
- javascript - 如何获取 Socket.IO 房间内的客户端计数?版本 3.1.1
- javascript - 每当我单击注册时,它都会显示“找不到您的文件”并且未显示警报
- android - android上多行textview上的水平滚动问题
- swift - 加载 UserDefault 并循环它们
- javascript - 将一串变量转换为变量
- symfony - 在自定义未映射过滤器中使用 easyadmin_autocomplete