【发布时间】:2011-03-14 09:51:32
【问题描述】:
有什么区别
mymodel=model.objects.get(name='pol')
和
mymodel=model.objects.filter(name='pol')
【问题讨论】:
标签: django
有什么区别
mymodel=model.objects.get(name='pol')
和
mymodel=model.objects.filter(name='pol')
【问题讨论】:
标签: django
Django QuerySet docs 对此非常清楚:
get(**kwargs)¶
返回匹配给定的对象 查找参数,应该在 字段查找中描述的格式。
get() 引发 MultipleObjectsReturned 如果发现不止一个对象。这 MultipleObjectsReturned 异常是 模型类的属性。
get() 引发了 DoesNotExist 异常 如果找不到对象 给定的参数。这个例外是 也是模型类的一个属性。
filter(**kwargs)
返回一个新的 QuerySet,其中包含与给定查找参数匹配的对象。
当您想要获得单个唯一对象时,基本上使用get(),而当您想要获得与您的查找参数匹配的所有对象时,基本上使用filter()。
【讨论】:
另外,顺便说一句,假设 pol 不可用:
if mymodel=model.objects.get(name='pol').exists()==False:
print "Pol does not exist"
你会得到: AttributeError:“模型”对象没有“存在”属性
但是:
if mymodel=model.objects.filter(name='pol').exists()==False:
print "Pol does not exist"
你会得到:Pol 不存在。
即如果要根据是否可以找到单个对象来运行某些代码,请使用过滤器。由于某种原因,exists() 适用于 QuerySet,但不适用于 get 返回的特定对象。
【讨论】:
请注意,django get() 方法在后台运行 filter() 方法,但会检查过滤结果集是否恰好是一条记录
【讨论】:
get() 返回一个匹配查找条件的对象。
filter() 返回一个匹配查找条件的 QuerySet。
例如下面的
Entry.objects.filter(pub_date__year=2006)
等价于
Entry.objects.all().filter(pub_date__year=2006)
这意味着如果模型类有大量对象,filter() 操作会稍微昂贵,而 get() 是直接方法。
【讨论】:
另一个区别:
因为'get'返回一个对象,所以不能在对象上调用'update'方法;除了一个模型方法(不应该这样做,以避免覆盖),被编写了。
但是,使用“过滤器”进行查询,可以让您更新首选记录。
例如:说一个模型; “产品”存在于您的应用中;那么你可以这样做:
old_product_name = Product.objects.filter(product_name="green-peas")
old_product_name.update(product_name="skewed-peas")
当然,当您使用“get”查询时,这是不可能的。
【讨论】:
如果您知道这是一个与您的查询匹配的对象,请使用“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!
否则使用“过滤器”,它会为您提供对象列表。
【讨论】:
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.objects.get(name='python')
book = Book.objects.get(学生)
会上报结果,因为book表有2条记录匹配student表。
两个.django过滤方法:
django的过滤方法是从数据库中获取匹配的结果,返回一个对象列表,如果记录不存在则返回[ ]。 如果数据库有记录,则记录名称的值为 python123,使用 student = Student 。对象.filter(名称='python123')。 Returning student 是一个对象列表。可以看出student[0]和上面get方法返回的student是一样的。
如果使用django的get获取关联表的数据,无论关联表有多少条记录,都不会报错。 django 除了强大的模型,表单和模板也很强大。 filter具有缓存数据的功能。第一次查询数据库生成缓存,下次调用filter方法可以直接获取缓存数据,每次在数据库中直接查询get方法。
【讨论】:
员工:姓名、年龄、地址 获取:
Employee.objects.get(id=1) 如果给定对象不存在,它将通过错误 筛选 : Employee.objects.filter(id=1) ]> 如果给定对象不存在,它将返回空查询集
【讨论】: