Django和#x27之间的差异;s filter()和get()方法
两者的区别是什么Django和#x27之间的差异;s filter()和get()方法,django,Django,两者的区别是什么 mymodel=model.objects.get(name='pol') 及 mymodel=model.objects.filter(name='pol') 在这一点上,双方的立场非常明确: get(**kwargs)^ 返回与给定值匹配的对象 查找参数,该参数应位于 字段查找中描述的格式 get()引发多个对象返回 如果找到多个对象。这个 多对象已返回异常 模型类的属性 get()引发DoesNotExist异常 如果找不到目标的对象 给定参数。这个例外是 也是模型类
mymodel=model.objects.get(name='pol')
及
mymodel=model.objects.filter(name='pol')
在这一点上,双方的立场非常明确:
get(**kwargs)^
返回与给定值匹配的对象
查找参数,该参数应位于
字段查找中描述的格式
get()引发多个对象返回
如果找到多个对象。这个
多对象已返回异常
模型类的属性
get()引发DoesNotExist异常
如果找不到目标的对象
给定参数。这个例外是
也是模型类的一个属性
过滤器(**kwargs)
返回包含与给定查找参数匹配的对象的新查询集
基本上,当您想要获取单个唯一对象时,请使用get()
;当您想要获取与查找参数匹配的所有对象时,请使用filter()
。另外,在一个侧面,假设pol不可用:
if mymodel=model.objects.get(name='pol').exists()==False:
print "Pol does not exist"
您将获得:
AttributeError:“模型”对象没有属性“存在”
但是:
你会得到:Pol不存在
也就是说,如果您想根据是否可以找到单个对象来运行某些代码,请使用过滤器。出于某种原因exists()适用于QuerySet,但不适用于与get一起返回的特定对象。请注意,在幕后,django get()方法运行filter()方法,但检查筛选结果集是否正好是一条记录如果您知道它是一个与查询匹配的对象,请使用“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!
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py”,get中第143行
返回self.get\u query\u set().get(*args,**kwargs)
文件“/usr/local/lib/python2.7/dist packages/django/db/models/query.py”,第407行,在get中
(self.model.\u meta.object\u name,num))
multipleObjectsReturn:get()返回了多个轮询——它返回了2!
否则,请使用“过滤器”,它将为您提供对象列表。get()返回与查找条件匹配的对象
filter()返回与查找条件匹配的查询集
例如,以下
Entry.objects.filter(pub_date__year=2006)
相当于
Entry.objects.all().filter(pub_date__year=2006)
这意味着,如果模型类有大量对象,则filter()操作的开销稍大,而get()是直接方法
来源:Model=Employee
雇员:姓名、年龄、地点
获取:
Employee.objects.get(id=1)
若给定的对象不在那个里,它就会出错
过滤器:
Employee.objects.filter(id=1)
]>
如果给定的对象不存在,它将返回空Queryset
另一个区别是:
由于“get”返回一个对象,因此无法对该对象调用方法“update”;除了编写了一个模型方法(为了避免重写,不应该这样做)
但是,使用“过滤器”查询可以更新首选记录
e、 g:比如说一个模特;'您的应用程序中存在“产品”;那么你可以这样做:
old_product_name = Product.objects.filter(product_name="green-peas")
old_product_name.update(product_name="skewed-peas")
当然,当您使用“get”进行查询时,这是不可能的。答案很有用,而且我遗漏了一些关于get()的内容,Sdolan在这里告诉了我们可能的重复
old_product_name = Product.objects.filter(product_name="green-peas")
old_product_name.update(product_name="skewed-peas")