使用get_queryset对列表视图进行排序 [英] Ordering listview with get_queryset

查看:15
本文介绍了使用get_queryset对列表视图进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

发帖和作者两种模式
此视图显示每个作者的最后一篇文章(作者是外国关键字)

我希望将这些帖子按降序排列,但它不起作用。 模板继续以升序方式显示这些内容。
我尝试以下操作:

views.py

class LastestListView(ListView):
    context_object_name = 'posts'
    model = models.Post
    ordering = ['-date']
    paginate_by = 10

    def get_queryset(self):
        return self.model.objects.filter(pk__in=
        Post.objects.values('author__id').annotate(
            max_id=Max('id')).values('max_id'))

或:

class LastestListView(ListView):
    context_object_name = 'posts'
    model = models.Post
    paginate_by = 10

    def get_queryset(self):
        return self.model.objects.filter(pk__in=
        Post.objects.order_by('-date').values('author__id').annotate(
            max_id=Max('id')).values('max_id'))

解决方案

必须在查询集的开头设置顺序:

class LastestListView(ListView):
    context_object_name = 'posts'
    model = models.Post
    paginate_by = 10

    def get_queryset(self):
        return self.model.objects.order_by('-date').filter(pk__in=
        Post.objects.values('author__id').annotate(
            max_id=Max('id')).values('max_id'))

推荐答案

更确切地说,排序应该应用于主查询,而不是子查询。

我更喜欢筛选器之后的排序,这只是见仁见智。

def get_queryset(self):
    qs = (
        self.model.objects
        .filter(
            pk__in=(
                Post.objects
                .values('author_id')
                .annotate(max_id=Max('id'))
                .values('max_id')
            )
        )
        .order_by('-date')
    )
    # print(str(qs.query))   # SQL check is perfect for debugging
    return qs

也许这种带有严格缩进的更稀疏的样式有助于编写易于阅读的代码。这样做的好处是您可以更容易地注释掉方法或通过更改行的顺序来更改方法的顺序。您还可以清楚地看到order_by位于主查询或子查询中。

这篇关于使用get_queryset对列表视图进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆