Sre*_*uli 2 django django-models django-annotate
我有一个名为的模型Post,它有两个字段upvotes和downvotes. 现在upvotes,downvotes是ManyToManyField到Profile。这是模型:
class Post(models.Model):
profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
title = models.CharField(max_length=300)
content = models.CharField(max_length=1000)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
subreddit = models.ForeignKey(Subreddit, on_delete=models.CASCADE)
upvotes = models.ManyToManyField(Profile, blank=True, related_name='upvoted_posts')
downvotes = models.ManyToManyField(Profile, blank=True, related_name='downvoted_posts')
Run Code Online (Sandbox Code Playgroud)
所以,我想获取所有帖子,使它们按以下顺序排列
total(upvotes) - total(downvotes)
所以我使用了这个查询:
Post.objects.annotate(
total_votes=Count('upvotes')-Count('downvotes')
).order_by('total_votes')
Run Code Online (Sandbox Code Playgroud)
此查询的问题total_votes是结果总是为零。
以下查询将解释这种情况:
In [5]: Post.objects.annotate(up=Count('upvotes')).values('up')
Out[5]: <QuerySet [{'up': 1}, {'up': 3}, {'up': 2}]>
In [6]: Post.objects.annotate(down=Count('downvotes')).values('down')
Out[6]: <QuerySet [{'down': 1}, {'down': 1}, {'down': 1}]>
In [10]: Post.objects.annotate(up=Count('upvotes'), down=Count('downvotes'), total=Count('upvotes')-Count('downvotes')).values('up', 'down', 'total')
Out[10]: <QuerySet [{'up': 1, 'down': 1, 'total': 0}, {'up': 3, 'down': 3, 'total': 0}, {'up': 2, 'down': 2, 'total': 0}]>
Run Code Online (Sandbox Code Playgroud)
似乎都up与down由具有相同值(实际上是的值up)。我该如何解决这个问题?
我试过这个:
In [9]: Post.objects.annotate(up=Count('upvotes')).annotate(down=Count('downvotes')).values('up', 'down')
Out[9]: <QuerySet [{'up': 1, 'down': 1}, {'up': 3, 'down': 3}, {'up': 2, 'down': 2}]>
Run Code Online (Sandbox Code Playgroud)
但即使这样也会产生相同的输出。
尝试使用dictinct参数:
Post.objects.annotate(
total_votes=Count('upvotes', distinct=True)-Count('downvotes', distinct=True)
).order_by('total_votes')
Run Code Online (Sandbox Code Playgroud)
从文档:
将多个聚合与 annotate() 组合将产生错误的结果,因为使用连接而不是子查询。对于大多数聚合,没有办法避免这个问题,但是,Count 聚合有一个不同的参数可能会有所帮助。
| 归档时间: |
|
| 查看次数: |
2956 次 |
| 最近记录: |