Django的filter()和get()方法之间的区别

Pol*_*Pol 21 django

有什么区别

mymodel=model.objects.get(name='pol')
Run Code Online (Sandbox Code Playgroud)

mymodel=model.objects.filter(name='pol')
Run Code Online (Sandbox Code Playgroud)

Sam*_*lan 50

Django的查询集文档都对这个很清楚的:

get(**kwargs)¶

返回与给定查找参数匹配的对象,该参数应采用字段查找中描述的格式.

如果找到多个对象,则get()引发MultipleObjectsReturned.MultipleObjectsReturned异常是模型类的属性.

如果找不到给定参数的对象,则get()引发一个DoesNotExist异常.此异常也是模型类的属性.

filter(**kwargs)

返回包含与给定查找参数匹配的对象的新QuerySet.

基本上,使用get()时你想获得一个唯一的对象,而filter()当你想获得的所有对象符合您查询参数.


use*_*288 7

另外,在旁注中,假设pol不可用:

if mymodel=model.objects.get(name='pol').exists()==False:
   print "Pol does not exist"
Run Code Online (Sandbox Code Playgroud)

你会得到:AttributeError:'Model'对象没有属性'exists'

但:

if mymodel=model.objects.filter(name='pol').exists()==False:
   print "Pol does not exist"
Run Code Online (Sandbox Code Playgroud)

你会得到:Pol不存在.

即如果要根据是否可以找到单个对象来运行某些代码,请使用过滤器.由于某种原因,exists()适用于QuerySet,但不适用于使用get返回的特定对象.


Asi*_*sif 6

get() 返回一个与查找条件匹配的对象。

filter() 返回一个与查找条件匹配的查询集。

例如,以下

Entry.objects.filter(pub_date__year=2006)
Run Code Online (Sandbox Code Playgroud)

相当于

Entry.objects.all().filter(pub_date__year=2006)
Run Code Online (Sandbox Code Playgroud)

这意味着如果模型类有大量对象,则 filter() 的操作稍微昂贵,而 get() 是直接方法。

来源:Django 进行查询


Avi*_*aor 5

请注意,在幕后,django get()方法运行filter()方法,但检查过滤器结果集是否只是一条记录