.get()和.fetch(1)有什么区别?
我写了一个应用程序,其中有一部分使用了一个网址解析器,以一种类似于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。