Django查询:如何按投票数排序帖子?
我目前正在开发一个网站(与Django合作),在那里人们可以写一个故事,这个故事可以由自己或其他人投票决定。以下是Profile、Story和Upvote的课程:Django查询:如何按投票数排序帖子?,django,django-models,django-templates,django-views,django-queryset,Django,Django Models,Django Templates,Django Views,Django Queryset,我目前正在开发一个网站(与Django合作),在那里人们可以写一个故事,这个故事可以由自己或其他人投票决定。以下是Profile、Story和Upvote的课程: class Profile(AbstractBaseUser, PermissionsMixin): email = models.EmailField(unique=True) first_name = models.CharField(max_length=30, null=True) last_name = mode
class Profile(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True)
first_name = models.CharField(max_length=30, null=True)
last_name = models.CharField(max_length=30, null=True)
class Story(models.Model):
author = models.ForeignKey('accounts.Profile', on_delete=models.CASCADE, related_name="author")
title = models.CharField(max_length=50)
content = models.TextField(max_length=10000)
class Upvote(models.Model):
profile = models.ForeignKey('accounts.Profile', on_delete=models.CASCADE, related_name="upvoter")
story = models.ForeignKey('Story', on_delete=models.CASCADE, related_name="upvoted_story")
upvote_time = models.DateTimeField(auto_now=True)
如您所见,upvoter使用两个外键来存储upvoter和相关的故事。现在,我想做一个查询,它提供了所有的故事,按它们的投票数排序。我自己也尽了最大努力提出了一些问题,但这并不完全是我要寻找的
这一个根本不起作用,因为出于某种原因,它只是按照它们创建的顺序给我所有的故事。此外,它还包含重复项,尽管我希望它们按故事分组
hot_feed = Upvote.objects.annotate(upvote_count=Count('story')).order_by('-upvote_count')
这是一种工作。但是,如果我试图访问模板中的某个特定故事,它只会返回id。因此,我无法从该id获取标题、作者和内容,因为它只是一个整数,而不是一个对象
hot_feed = Upvote.objects.values('story').annotate(upvote_count=Count('story')).order_by('-upvote_count')
有人能帮我找到我正在搜索的查询吗?您是从错误的模型进行查询的,您在这里基本上获取了按故事数排序的
Upvote
s,或者类似的内容
但是您的probaby希望通过向上投票的数量检索Story
s,因此您需要使用Story
作为“queryset root”,并用向上投票的数量对其进行注释:
Story.objects.annotate(
upvote_count=Count('upvoted_story')
).order_by('-upvote_count')
在这种情况下,查询为:
Story.objects.annotate(
upvote_count=Count('upvotes')
).order_by('-upvote_count')
Story.objects.annotate(
upvote\u count=计数(“upvotes”)
).order_by('-upvote_count')
请删除与此问题无关的所有字段(我们希望有最少的示例)。即可!谢谢,我一定是被我该拿什么样的选票或故事弄糊涂了。无论如何,这是有效的!你真的帮了我,非常感谢!不过,如果你不介意的话,我还有一个问题。在该查询中,您计算“Upporated_story”,但它如何知道一个故事是否被Upporated,因为它存储在不同的模型中?最后,你可以通过“向上投票”来点餐。它从哪里得到的信息?哦,不,好的,我知道了。您使用了相关的名称来构造查询,对吗?@Frederikvancloster:'upvoted\u story'
是ForeignKey
的相关名称
,因此它将在数据库中执行与groupby
的联接,并计算相关的upvote数。我们将该计数存储为upvote\u count
(这是.annotation(..)
中=/code>前面的第部分。因此,这是一个整数,我们按降序排序。是的,我现在明白了!非常感谢:)@FrederikVanclooster:的确如此。它使用外键的名称。
Story.objects.annotate(
upvote_count=Count('upvotes')
).order_by('-upvote_count')