【问题标题】:Difference between Django's filter() and get() methodsDjango 的 filter() 和 get() 方法之间的区别
【发布时间】:2011-03-14 09:51:32
【问题描述】:

有什么区别

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

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

【问题讨论】:

标签: django


【解决方案1】:

Django QuerySet docs 对此非常清楚:

get(**kwargs)¶

返回匹配给定的对象 查找参数,应该在 字段查找中描述的格式。

get() 引发 MultipleObjectsReturned 如果发现不止一个对象。这 MultipleObjectsReturned 异常是 模型类的属性。

get() 引发了 DoesNotExist 异常 如果找不到对象 给定的参数。这个例外是 也是模型类的一个属性。

filter(**kwargs)

返回一个新的 QuerySet,其中包含与给定查找参数匹配的对象。

当您想要获得单个唯一对象时,基本上使用get(),而当您想要获得与您的查找参数匹配的所有对象时,基本上使用filter()

【讨论】:

  • 答案很有用,我错过了 Sdolan 在这里告诉的一些关于 get() 的事情
【解决方案2】:

另外,顺便说一句,假设 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 返回的特定对象。

【讨论】:

    【解决方案3】:

    请注意,django get() 方法在后台运行 filter() 方法,但会检查过滤结果集是否恰好是一条记录

    【讨论】:

      【解决方案4】:

      get() 返回一个匹配查找条件的对象。

      filter() 返回一个匹配查找条件的 QuerySet。

      例如下面的

      Entry.objects.filter(pub_date__year=2006)
      

      等价于

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

      这意味着如果模型类有大量对象,filter() 操作会稍微昂贵,而 get() 是直接方法。

      来源:Django making queries

      【讨论】:

        【解决方案5】:

        另一个区别:

        因为'get'返回一个对象,所以不能在对象上调用'update'方法;除了一个模型方法(不应该这样做,以避免覆盖),被编写了。

        但是,使用“过滤器”进行查询,可以让您更新首选记录。

        例如:说一个模型; “产品”存在于您的应用中;那么你可以这样做:

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

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

        【讨论】:

          【解决方案6】:

          如果您知道这是一个与您的查询匹配的对象,请使用“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!
          

          否则使用“过滤器”,它会为您提供对象列表。

          【讨论】:

            【解决方案7】:

            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.objects.get(name='python')

            book = Book.objects.get(学生)

            会上报结果,因为book表有2条记录匹配student表。

            两个.django过滤方法:

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

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

            【讨论】:

              【解决方案8】:

              模型 = 员工

              员工:姓名、年龄、地址 获取:

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

              【讨论】:

                猜你喜欢
                • 2010-12-05
                • 1970-01-01
                • 2011-11-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-05-09
                • 2011-12-20
                相关资源
                最近更新 更多