【发布时间】:2013-03-06 15:29:57
【问题描述】:
我是 Django 的新手,想了解 filter 与 get 之间的区别
获取
Entry.objects.get(id__exact=14)
过滤器
Entry.objects.filter(id__exact=14)
上面的说法有什么不同?
提前致谢。
【问题讨论】:
-
另外,前面问题的答案质量比这里给出的要好...
标签: django-models
我是 Django 的新手,想了解 filter 与 get 之间的区别
获取
Entry.objects.get(id__exact=14)
过滤器
Entry.objects.filter(id__exact=14)
上面的说法有什么不同?
提前致谢。
【问题讨论】:
标签: django-models
get 仅带来与您正在寻找的元素相同的元素,但 filter 带来与您想要的该项目相关的所有内容。
过滤器返回找到的许多东西。 get 只返回一件事到你正在寻找的东西
例如:
获取
Task.objects.get(id=1,status=1)
过滤器
Groups.objects.filter(user=1)
【讨论】:
当你想得到一个唯一的对象时基本上使用get,当你想得到所有匹配你的查找参数的对象时过滤
__data = User.objects.get(is_active=1).exclude(id=id)
错误:get() 返回了多个用户 - 它返回了 19!, 类型:
<class 'django.contrib.auth.models.MultipleObjectsReturned'>
-----成功-----
__data = User.objects.filter(is_active=1).exclude(id=id)
--------成功-----
【讨论】:
如果您知道这是一个与您的查询匹配的对象,请使用get。如果超过一个,它将失败,并给出如下错误:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 143, in get
return self.get_query_set().get(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 407, in get
(self.model._meta.object_name, num))
MultipleObjectsReturned: get() returned more than one Poll -- it returned 2!
否则使用filter,它会为您提供对象列表。
【讨论】:
为了补充其他人所说的...(get 只返回 1 条记录,而 filter 返回一组),需要注意的重要一点是结果的 type。
get() 返回一个对象,而 filter 返回一个查询集类型。这意味着您可以执行类似的操作
age = User.objects.get(name="Ryan").age
如果您使用过滤器,则需要执行几个额外步骤:
ages = User.Objects.filter(name="ryan").values('age')
for user_age in users:
print(user_age)
需要注意的重要一点是 filter 返回一个可迭代的类型,其中的 values() 方法指示您想要哪些字段。 Get 只是返回一个以字段为属性的对象,因此获取所需的数据要简单得多。
【讨论】:
get 不返回查询集 - 它返回单个对象。 filter 返回一个 queryset,正如您正确指出的那样,它是一个可迭代对象。