.get()和.fetch(1)有什么区别?

15 投票
2 回答
39079 浏览
提问于 2025-04-15 20:55

我写了一个应用程序,其中有一部分使用了一个网址解析器,以一种类似于ReST的方式获取特定数据。比如,如果你输入路径 /foo/bar,它会找到所有与 bar 相关的项目;如果你输入 /foo,它会返回所有与 foo 相关的项目。

我的应用程序有一个查询,像这样:

data = Paths.all().filter('path =', self.request.path).get()

这个查询运行得很好。现在我想用模板把这些数据发送到用户界面。

{% for datum in data %}

{{ datum.title }}

{{ datum.content }}

   </div>

{% endfor %}

但是当我这样做时,出现了“数据不可迭代”的错误。所以我把Django更新为 {% for datum in data.all %},结果似乎拉取了比我原本给它更多的数据。它显示了数据存储中的所有数据,这并不是我想要的。因此,我把Django中的 .all 去掉了,并把数据存储的查询改成了:

data = Paths.all().filter('path =', self.request.path).fetch(1)

现在它按我想要的方式工作了。在文档中提到:

db.get() 函数用于根据一个键(或一组键)从数据存储中获取一个实体。

所以我的问题是,为什么我可以在使用 fetch() 时对查询进行迭代,而使用 get() 时却不行?我哪里理解错了呢?

2 个回答

4

get() 这个方法要求你必须有且只有一个元素,它会把这个元素返回给你。而 fetch() 则是返回一个包含前 _n_ 个元素_list_,在这个情况下,n 的值是 1,也就是说它会返回一个包含第一个元素的列表。

12

你可能看错文档了,应该查看的是 get() 的正确版本——也就是 查询对象上的 get() 方法。简单来说,.fetch() 总是返回一个列表,而 .get() 则返回第一个结果,如果没有结果的话就返回 None。

撰写回答