Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django和#x27之间的差异;s filter()和get()方法_Django - Fatal编程技术网

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")