Django-如何按投票对Post模型进行排序?

Django-如何按投票对Post模型进行排序?,django,sorting,django-models,Django,Sorting,Django Models,我正在尝试在views.py中对帖子进行排序,从最顶端到最底端的投票数最多 以下是我目前掌握的情况: 在models.py中发布模型 class Post(models.Model): title = models.CharField("HeadLine", max_length=256, unique=True) creator = models.ForeignKey(User, on_delete= models.SET_NULL, null=True)

我正在尝试在views.py中对帖子进行排序,从最顶端到最底端的投票数最多

以下是我目前掌握的情况:

在models.py中发布模型

class Post(models.Model):
    title = models.CharField("HeadLine", max_length=256, unique=True)
    creator = models.ForeignKey(User, on_delete= models.SET_NULL, null=True)
    created_on = models.DateTimeField(auto_now_add=True)
    url = models.URLField("URL", max_length=256,blank=True)
    description = models.TextField("Description", blank=True)
    votes = models.IntegerField(null=True)
    comments = models.IntegerField(null=True)

    def __unicode__(self):
        return self.title
    
    def count_votes(self):
        self.votes = Vote.objects.filter(post = self).count()

    @property
    def sort_by_votes(self):
        return Vote.objects.filter(post = self).count()

    def count_comments(self):
        self.comments = Comment.objects.filter(post = self).count()
views.py中的帖子列表

 def NewPostListView(request):

    posts = sorted(Post.objects.all(), key=lambda p: p.sort_by_votes, reverse = True)
    for post in posts:
        post.count_votes()
        print(post)
        post.count_comments()
    context = {
        'posts': posts,
    }
    return render(request,'postlist.html', context)

我正在尝试执行类似于
posts=Post.objects.all()。到目前为止,使用
sorted()
似乎有效,但有时upvote值不正确。如何获得按投票对帖子进行排序的查询集?

您是否尝试过
posts=Post.objects.all().order\u by('voates')


count\u voces
Post
的方法,而不是属性。但是,
投票
是。

您是否尝试过
posts=Post.objects.all()


count\u voces
Post
的方法,而不是属性。但是,
投票
是。

因为您的函数
count\u voces
调用了一个名为
投票
的模型,我认为在您的
Post
模型中,您有一个指向
投票
模型的外键,反之亦然。如果不是,我建议去

假设这样,您可以使用


由于您的函数
count\u voces
正在调用名为
voces
的模型,我认为在您的
Post
模型中,您有一个指向
voces
模型的外键,反之亦然。如果不是,我建议去

假设这样,您可以使用


如果要将投票设置为Post模型的默认排序,可以在Post类Meta下设置排序属性

class Post(models.Model):
    ...

    class Meta:
        ordering = "-votes"

请注意负数,因为您希望按降序排序(顶部的最大值)

如果您希望将投票设置为Post模型的默认排序,则可以在Post class Meta下设置排序属性

class Post(models.Model):
    ...

    class Meta:
        ordering = "-votes"

请注意负数,因为您希望按降序排序(顶部的最大值)

如果投票字段可以不止一个,请使用Sum():
Post.objects.values(“creator”)。注释(Count('creator')),Sum\u voces=Sum('voces')。排序依据('Sum\u voces')
。要按降序添加最小符号“-”:Post.objects.order\u依据('-voces)。如果投票字段可以不止一个,请使用Sum():
Post.objects.values(“creator”)。注释(Count('creator')),Sum_voces=Sum('voces'))。排序依据('Sum_voces')
。要通过降序进行简单排序,请添加最小符号“-”:Post.objects.order_by('-voces')。他首先要的是最大的数字,所以
排序依据('-voces)
更好他首先想要最大的数字,因此,
按('-vots')排序更好