【问题标题】:Django filter vs get in modelsDjango 过滤器与模型中的获取
【发布时间】:2013-03-06 15:29:57
【问题描述】:

我是 Django 的新手,想了解 filter 与 get 之间的区别

获取

Entry.objects.get(id__exact=14)

过滤器

Entry.objects.filter(id__exact=14)

上面的说法有什么不同?

提前致谢。

【问题讨论】:

标签: django-models


【解决方案1】:

get 仅带来与您正在寻找的元素相同的元素,但 filter 带来与您想要的该项目相关的所有内容。

过滤器返回找到的许多东西。 get 只返回一件事到你正在寻找的东西

例如:

获取

Task.objects.get(id=1,status=1)

过滤器

Groups.objects.filter(user=1)

【讨论】:

    【解决方案2】:

    当你想得到一个唯一的对象时基本上使用get,当你想得到所有匹配你的查找参数的对象时过滤

     __data = User.objects.get(is_active=1).exclude(id=id)
    

    错误:get() 返回了多个用户 - 它返回了 19!, 类型:<class 'django.contrib.auth.models.MultipleObjectsReturned'>

    -----成功-----

    __data = User.objects.filter(is_active=1).exclude(id=id)
    

    --------成功-----

    Check the Link

    【讨论】:

      【解决方案3】:

      如果您知道这是一个与您的查询匹配的对象,请使用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,它会为您提供对象列表。

      【讨论】:

        【解决方案4】:

        为了补充其他人所说的...(get 只返回 1 条记录,而 filter 返回一组),需要注意的重要一点是结果的 type

        get() 返回一个对象,而 filter 返回一个查询集类型。这意味着您可以执行类似的操作

        age = User.objects.get(name="Ryan").age
        

        如果您使用过滤器,则需要执行几个额外步骤:

        ages = User.Objects.filter(name="ryan").values('age')
        for user_age in users:
            print(user_age)
        

        需要注意的重要一点是 filter 返回一个可迭代的类型,其中的 values() 方法指示您想要哪些字段。 Get 只是返回一个以字段为属性的对象,因此获取所需的数据要简单得多。

        【讨论】:

        • 我正要支持你的答案,但其中有一个错误:get 不返回查询集 - 它返回单个对象。 filter 返回一个 queryset,正如您正确指出的那样,它是一个可迭代对象。
        猜你喜欢
        • 2022-08-02
        • 1970-01-01
        • 1970-01-01
        • 2012-03-13
        • 2010-11-04
        • 2013-02-02
        • 2021-03-19
        相关资源
        最近更新 更多