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

e7arh2l6  于 2022-12-24  发布在  Go
关注(0)|答案(9)|浏览(253)

有什么区别

mymodel=model.objects.get(name='pol')

以及

mymodel=model.objects.filter(name='pol')
ep6jt1vc

ep6jt1vc1#

Django QuerySet docs对此非常清楚:
第一个月
返回与给定查找参数匹配的对象,该对象应采用字段查找中描述的格式。
如果找到多个对象,get()将引发MultipleObjectsReturned。MultipleObjectsReturned异常是模型类的一个属性。
get()在没有找到给定参数的对象时会引发一个DoesNotExist异常,这个异常也是model类的一个属性。
filter(**kwargs)
返回包含与给定查找参数匹配的对象的新QuerySet。
基本上,当您想要获取一个唯一的对象时,使用get();当您想要获取与查找参数匹配的所有对象时,使用filter()

wsewodh2

wsewodh22#

注意,djangoget()方法在后台运行filter()方法,但是检查filter结果集是否正好是一条记录

ovfsdjhp

ovfsdjhp3#

另外,附带说明一下,假设pol不可用:

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

您将获得:属性错误:"Model"对象没有属性"exists"
但是:

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

您将获得:pol不存在。
也就是说,如果你想根据是否能找到一个对象来运行一些代码,可以使用filter。由于某些原因,exists()只对QuerySet起作用,而对get返回的特定对象不起作用。

mefy6pfw

mefy6pfw4#

get()返回一个匹配查找条件的对象。
filter()返回与查找条件匹配的QuerySet。
例如,以下内容

Entry.objects.filter(pub_date__year=2006)

相当于

Entry.objects.all().filter(pub_date__year=2006)

这意味着如果模型类有大量的对象,filter()是稍微昂贵的操作,而get()是直接方法。
来源:Django正在查询

xkftehaa

xkftehaa5#

另一个区别:
由于“get”返回对象,因此不能对该对象调用方法“update”;除了一个模型方法(为了避免重写,不应该这样做)。
但是,使用“filter”查询,您可以更新首选记录。
例如:比如说一个模特;您的应用中存在“产品”;那么你可以这样做:

old_product_name = Product.objects.filter(product_name="green-peas")
old_product_name.update(product_name="skewed-peas")

当然,当您使用'get'查询时,这是不可能的。

mm9b1k5b

mm9b1k5b6#

Django的get和filter方法是django模型常用的方法,在这里进行了区分。
定义2个模型。

class Student(models.Model):
 Name = models.CharField('name', max_length=15, default='')
 Age = models.CharField('age', max_length=15, default='')

class Book(models.Model):
 student = models.ForeignKey(Student)

A.django get方法:

  1. django的get方法是从数据库中获取匹配结果,返回一个对象,如果记录不存在,就会报错,比如我的数据库中有一条记录,记录名的值是django 123,我用student = Student . objects . get(name = 'django 123'),返回一个记录对象,可以通过student . _ _ dict _ _查看,后者返回字典形式,{' key ':valeus},key是字段的名称,而values 是值的内容。使用get方法查询数据库中不存在的记录时,程序将报告错误。例如:student = Student . objects . get(name = ' django '),显然这个'django '在数据库中不存在,它会报告一个错误。
    1.如果你使用django的get来获取关联表的数据,如果key表的数据大于2,就会报错,如果student表中有记录:
d name age
1 python 24

Book table:

id student_id
1 1
2 1

学生=学生.对象.get(名称=“python”)
book =书本.对象.get(学生)
由于book表有2条记录与student表匹配,因此将报告结果。
二.django过滤方法:

  1. django的filter方法是从数据库中获取匹配结果,返回一个对象列表,如果记录不存在,则返回[ ],如果数据库中有记录,则记录名的值为python 123,使用student =学生.对象.过滤器(name = 'python 123').返回的student是一个对象列表,可以看出student [ 0 ]和上面get方法返回的student是一样的。
    1.如果你使用django的get来获取关联表的数据,不管关联表中有多少条记录,都不会报错,django除了强大的模型,表单和模板也非常强大,filter有缓存数据的功能,第一次查询数据库生成该高速缓存,下次调用filter方法,就可以直接获取缓存的数据,每次直接在数据库中查询get方法。
a64a0gku

a64a0gku7#

如果你知道只有一个对象与你的查询匹配,使用“get”。2如果有多个匹配对象,它将失败,并给出如下错误

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”,它会给你一个对象列表。

c8ib6hqw

c8ib6hqw8#

mymodel=model.objects.get(name='pol')
# OR
mymodel=model.objects.filter(name='pol')

案例1:假设我们只有一条记录匹配name字段 pol

  • get()将返回单个对象,而filter()也将返回列表中的单个对象。

案例2:假设我们有多个记录匹配name字段 pol

  • get()将引发MultipleObjectsReturned,但在filter()的情况下,它将返回一个对象列表。

案例3:假设我们没有找到与名称字段 pol 匹配的记录。

  • get()会引发DoesNotExist异常,但在filter()的情况下,它将返回一个空列表。
zpgglvta

zpgglvta9#

型号=员工

雇员:姓名、年龄、所在地获取:
Employee.objects.get(id=1)如果给定的对象不存在,则会出错Filter:Employee.objects.filter(id=1)]〉如果给定的对象不存在,它将返回空查询集

相关问题