gpt4 book ai didi

django如何从可能为空的列表中获取第0个项目

转载 作者:行者123 更新时间:2023-12-04 05:14:37 25 4
gpt4 key购买 nike

我有一个带有模型“Post”的简单博客应用程序。如果删除“帖子”模型中的所有条目,当我尝试按日期排序的帖子列表中的第一项时,会出现错误,我这样做是:

latest_post = Post.objects.order_by('-date_created')[0]

错误是:IndexError:列表索引超出范围

作为修复,我现在得到这样的项目:
all_posts = Post.objects.order_by('-date_created')
latest_post = ()
if (all_posts):
latest_post = all_posts[0]

如果我的模型“Post”中没有项目,并且没有引发异常,则此方法有效。
但是对我来说,这似乎太多了代码,无法做一些相当简单的事情。我认为有一种使用django QuerySet API的更好的方法,但是在文档中找不到任何内容。

有任何想法吗?

编辑:奇怪的是,当发布模型中没有任何项目时,这不会引发任何错误:
latest_post_list = Post.objects.all().order_by('-date_created')[1:10]

最佳答案

对此并不奇怪,这完全是预期的行为。空列表(或本例中的查询集)的结果为False,因此您永远不会索引到查询集中。虽然如果您尝试索引一个空列表(如您使用第一种方法一样),它将抛出IndexError。

您编写的内容可以使用,但不是最好的imo。更好的写法是这样的

try:
latest_post = Post.objects.order_by('-date_created')[0]
except IndexError:
latest_post = None

这是一种更pythonic的编写方式,更易于阅读和理解您要执行的操作。

甚至更好
try:
latest_post = Post.objects.latest('date_created')
except Post.DoesNotExist:
latest_post = None

注意在第二个示例中,它使用了latest()查询集方法。还要注意,该参数只是字段名,而不是-fieldname。您甚至还可以在模型中指定Meta类 get_latest_by = 'date_created',然后该行就变成 latest_post = Post.objects.latest(),甚至无需指定fieldname参数

关于django如何从可能为空的列表中获取第0个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6586040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com