在Django中,list.reverse()无法正常工作

4

我正在使用Django框架进行我的第一个项目,并决定创建一个博客,因为在网上很容易找到相关的资料。然后,我发现了Paginator模块,并决定使用它。问题是,每当我添加一篇文章时,它都会添加到数据库的末尾,所以到目前为止,我的博客显示的是旧的文章。

因此,我决定使用.reverse(),像这样:

def index(request):
    posts = Post.objects.all()
    posts.reverse()
    paginator = Paginator(posts, 2)

    try:
        page = int(request.GET.get("page", "1"))
    except ValueError:
        page = 1

    try:
        posts = paginator.page(page)
    except (InvalidPage, EmptyPage):
        posts = paginator.page(paginator.num_pages)

    return render_to_response('index.html', {
                                             'Posts': posts,
                                             'Sideposts': Sidepost.objects.all(),
                                             })

唯一的问题是,这不起作用,至少在使用Paginator时不起作用。当我停止使用Paginator时它可以工作,但此外则无法工作。
我认为这是一个非常奇怪的行为,我查看了一下但没有找到任何有助于解决这个问题的东西。我做错了什么吗?
2个回答

8

让数据库完成排序:

posts = Post.objects.all().order_by('-id')

当然,最好使用日期字段或类似的东西。

1
这样做更好,因为它允许分页仅加载页面所需的内容。将其转换为列表会加载查询中的所有内容。 - joshua

2
首先,Post.objects.all() 不返回列表对象,而是查询集对象。
其次,reverse 方法不会改变查询集本身,只会返回反转后的查询集版本。
如果您想使用 reverse 方法并且需要列表对象,请将其转换为列表 posts = list(Post.objects.all())
也许以下方式更加可取:
posts = Post.objects.all().reverse()

如果没有reverse方法,问题是否执行失败? - thefourtheye
它运行了,谢谢!至于第二部分,因为我想按照时间对我的帖子进行排序,每次添加一个新的帖子它都会到数据库的末尾,所以只使用 .reverse() 对我的目的来说是否就足够了呢? - AugustoQ
@thefourtheye,你说得对。我更新了答案。感谢你的评论。 - falsetru
@AugustoQ,我更新了答案。我的初始答案关于reverse方法是错误的。Queryset.reverse返回新的查询集而不像list.reverse那样改变查询集本身。 - falsetru
@falsetru,你的第一个答案实际上起作用了。这个我之前尝试过,但是没有成功。当我输入posts = Post.objects.all().reverse()时,什么也没有发生,就像我分别输入它们一样。当我使用posts = list(Post.objects.all())然后再使用posts.reverse()时,它完美地工作了。 - AugustoQ
@AugustoQ,你试过使用 order_by('...') 吗? - falsetru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接