之间有什么区别
mymodel=model.objects.get(name='pol')
和
mymodel=model.objects.filter(name='pol')
答案 0 :(得分:39)
Django QuerySet docs非常明确:
get(**kwargs)¶
返回与给定匹配的对象 查找参数,应该在 字段查找中描述的格式。
get()引发MultipleObjectsReturned 如果找到多个对象。该 MultipleObjectsReturned异常是 模型类的一个属性。
get()引发了一个DoesNotExist异常 如果找不到某个物体 给定参数。这个例外是 也是模型类的一个属性。
filter(**kwargs)
返回一个新的QuerySet,其中包含与给定查找参数匹配的对象。
如果您希望获得单个唯一对象,则基本上使用get()
;当您希望获得与您匹配的所有对象时,使用filter()
查找参数。
答案 1 :(得分:7)
另外,在旁注中,假设pol不可用:
if mymodel=model.objects.get(name='pol').exists()==False:
print "Pol does not exist"
你会得到:
AttributeError:'Model'对象没有'exists'属性
但是:
if mymodel=model.objects.filter(name='pol').exists()==False:
print "Pol does not exist"
你会得到:Pol不存在。
即。如果要根据是否可以找到单个对象来运行某些代码,请使用filter。出于某种原因,exists()适用于QuerySet,但不适用于使用get返回的特定对象。
答案 2 :(得分:5)
请注意,在幕后,django get()方法运行filter()方法,但检查过滤器结果集是否只是一条记录
答案 3 :(得分:1)
另一个区别:
因为'get'返回的是一个对象,所以不能在该对象上调用'update'方法;除了一个模型方法(不应该这样做,以避免覆盖),被写入。
但是,使用“过滤器”进行查询,您可以更新首选记录。
例如:说一个模型; “产品”存在于您的应用中;那么你可以这样做:
old_product_name = Product.objects.filter(product_name="green-peas")
old_product_name.update(product_name="skewed-peas")
当然,当您使用 'get' 查询时,这是不可能的。
答案 4 :(得分:0)
如果您知道它是一个与您的查询匹配的对象,请使用“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!
否则使用“filter”,它会为您提供一个对象列表。
答案 5 :(得分:0)
get()返回与查找条件匹配的对象。
filter()返回一个匹配查找条件的QuerySet。
例如,以下
Entry.objects.filter(pub_date__year=2006)
相当于
Entry.objects.all().filter(pub_date__year=2006)
这意味着如果模型类具有大量对象,则filter()稍微昂贵,而get()是直接方法。
答案 6 :(得分:0)
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 获取方法:
django的get方法是从数据库中获取一个匹配的结果,返回一个对象,如果记录不存在就会报错。例如,如果我的数据库中有一条记录,记录名称的值为 django123,我使用 student = Student 。对象。获取(名称 = 'django123'), 返回一个记录对象,您可以通过 student 进行查看。 _ _ dict _ _,返回一个字典形式,{'key':valeus},key是字段的名字,而values是值的内容。 使用get方法查询数据库中不存在的记录,程序会报错。 例如:学生 = 学生。对象。 get(name = 'django'),显然数据库中不存在这个'django',会报错。
如果使用django的get来获取关联表的数据,如果key表的数据大于2,就会报错。 如果学生表中有记录:
d name age
1 python 24
Book table:
id student_id
1 1
2 1
<块引用>
student = Student.objects.get(name='python')
<块引用>book = Book.objects.get(student)
会报告结果,因为book表有2条记录与student表匹配。
2.django 过滤方法:
django 的过滤方法是从数据库中获取一个匹配结果,返回一个对象列表,如果该记录不存在,则返回[]。 如果数据库有记录,记录名的值为python123,使用 student = Student 。对象 .filter ( name = ' python123 ' )。返回的学生是一个对象列表。可以看出student[0]和上面get方法返回的student是一样的。
如果使用django的get获取关联表的数据,无论关联表有多少条记录,都不会报错。 django 除了强大的模型,表单和模板也非常强大。 filter 具有缓存数据的功能。第一次查询数据库并生成缓存,下次调用filter方法可以直接获取缓存的数据,每次在数据库中直接查询get方法。
答案 7 :(得分:-1)
员工:姓名,年龄,所在地 获取:
Employee.objects.get(id = 1) 如果给定的对象不在那将会通过错误 筛选器: Employee.objects.filter(id = 1) ]> 如果给定的对象不存在,它将返回空的Queryset