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

时间:2010-07-11 05:11:12

标签: django

之间有什么区别
mymodel=model.objects.get(name='pol')

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

8 个答案:

答案 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()是直接方法。

来源:Django making queries

答案 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 获取方法:

  1. django的get方法是从数据库中获取一个匹配的结果,返回一个对象,如果记录不存在就会报错。例如,如果我的数据库中有一条记录,记录名称的值为 django123,我使用 student = Student 。对象。获取(名称 = 'django123'), 返回一个记录对象,您可以通过 student 进行查看。 _ _ dict _ _,返回一个字典形式,{'key':valeus},key是字段的名字,而values是值的内容。 使用get方法查询数据库中不存在的记录,程序会报错。 例如:学生 = 学生。对象。 get(name = 'django'),显然数据库中不存在这个'django',会报错。

  2. 如果使用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 过滤方法:

  1. django 的过滤方法是从数据库中获取一个匹配结果,返回一个对象列表,如果该记录不存在,则返回[]。 如果数据库有记录,记录名的值为python123,使用 student = Student 。对象 .filter ( name = ' python123 ' )。返回的学生是一个对象列表。可以看出student[0]和上面get方法返回的student是一样的。

  2. 如果使用django的get获取关联表的数据,无论关联表有多少条记录,都不会报错。 django 除了强大的模型,表单和模板也非常强大。 filter 具有缓存数据的功能。第一次查询数据库并生成缓存,下次调用filter方法可以直接获取缓存的数据,每次在数据库中直接查询get方法。

答案 7 :(得分:-1)

模型=员工

员工:姓名,年龄,所在地 获取:

  
    

Employee.objects.get(id = 1)             如果给定的对象不在那将会通过错误     筛选器:     Employee.objects.filter(id = 1)       ]>     如果给定的对象不存在,它将返回空的Queryset