Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django查询:如何按投票数排序帖子?_Django_Django Models_Django Templates_Django Views_Django Queryset - Fatal编程技术网

Django查询:如何按投票数排序帖子?

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

我目前正在开发一个网站(与Django合作),在那里人们可以写一个故事,这个故事可以由自己或其他人投票决定。以下是Profile、Story和Upvote的课程:

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