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)
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!
9条答案
按热度按时间ep6jt1vc1#
Django QuerySet docs对此非常清楚:
第一个月
返回与给定查找参数匹配的对象,该对象应采用字段查找中描述的格式。
如果找到多个对象,get()将引发MultipleObjectsReturned。MultipleObjectsReturned异常是模型类的一个属性。
get()在没有找到给定参数的对象时会引发一个DoesNotExist异常,这个异常也是model类的一个属性。
filter(**kwargs)
返回包含与给定查找参数匹配的对象的新QuerySet。
基本上,当您想要获取一个唯一的对象时,使用
get()
;当您想要获取与查找参数匹配的所有对象时,使用filter()
。wsewodh22#
注意,djangoget()方法在后台运行filter()方法,但是检查filter结果集是否正好是一条记录
ovfsdjhp3#
另外,附带说明一下,假设pol不可用:
您将获得:属性错误:"Model"对象没有属性"exists"
但是:
您将获得:pol不存在。
也就是说,如果你想根据是否能找到一个对象来运行一些代码,可以使用filter。由于某些原因,exists()只对QuerySet起作用,而对get返回的特定对象不起作用。
mefy6pfw4#
get()返回一个匹配查找条件的对象。
filter()返回与查找条件匹配的QuerySet。
例如,以下内容
相当于
这意味着如果模型类有大量的对象,filter()是稍微昂贵的操作,而get()是直接方法。
来源:Django正在查询
xkftehaa5#
另一个区别:
由于“get”返回对象,因此不能对该对象调用方法“update”;除了一个模型方法(为了避免重写,不应该这样做)。
但是,使用“filter”查询,您可以更新首选记录。
例如:比如说一个模特;您的应用中存在“产品”;那么你可以这样做:
当然,当您使用'get'查询时,这是不可能的。
mm9b1k5b6#
Django的get和filter方法是django模型常用的方法,在这里进行了区分。
定义2个模型。
A.django get方法:
1.如果你使用django的get来获取关联表的数据,如果key表的数据大于2,就会报错,如果student表中有记录:
学生=学生.对象.get(名称=“python”)
book =书本.对象.get(学生)
由于book表有2条记录与student表匹配,因此将报告结果。
二.django过滤方法:
1.如果你使用django的get来获取关联表的数据,不管关联表中有多少条记录,都不会报错,django除了强大的模型,表单和模板也非常强大,filter有缓存数据的功能,第一次查询数据库生成该高速缓存,下次调用filter方法,就可以直接获取缓存的数据,每次直接在数据库中查询get方法。
a64a0gku7#
如果你知道只有一个对象与你的查询匹配,使用“get”。2如果有多个匹配对象,它将失败,并给出如下错误
否则使用“filter”,它会给你一个对象列表。
c8ib6hqw8#
案例1:假设我们只有一条记录匹配name字段 pol。
案例2:假设我们有多个记录匹配name字段 pol。
案例3:假设我们没有找到与名称字段 pol 匹配的记录。
zpgglvta9#
型号=员工
雇员:姓名、年龄、所在地获取:
Employee.objects.get(id=1)如果给定的对象不存在,则会出错Filter:Employee.objects.filter(id=1)]〉如果给定的对象不存在,它将返回空查询集