【问题标题】:Django : Can we use .exclude() on .get() in django querysetsDjango:我们可以在 django 查询集中的 .get() 上使用 .exclude()
【发布时间】:2013-08-13 06:49:52
【问题描述】:

我们可以使用

 MyClass.objects.get(description='hi').exclude(status='unknown')

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    如果您在get() 之前执行exclude(),您的代码将按预期工作:

    MyClass.objects.exclude(status='unknown').get(description='hi')
    

    正如@Burhan Khalid 指出的那样,只有在结果查询恰好返回一行时,对.get 的调用才会成功。

    您也可以使用Q object 直接在.get 中指定过滤器:

    MyClass.objects.get(Q(description='hi') & ~Q(status='unknown'))
    

    请注意,Q 对象是必需的,因为您使用了 .exclude(并且 Django 的 ORM 没有不相等的字段查找,因此您必须使用 .exclude)。

    如果您的原始代码是(注意.exclude 已被.filter 替换):

    MyClass.objects.filter(status='unknown').get(description='hi')
    

    ...你可以这样做:

    MyClass.objects.get(status='unknown', description='hi')
    

    【讨论】:

      【解决方案2】:

      你想要:

      MyClass.objects.filter(description='hi').exclude(status='unknown')
      

      .get() 将引发 MultipleObjectsReturned 如果您的查询导致多个匹配集;考虑到您正在搜索不是主键的内容,这很可能会发生。

      使用过滤器将为您提供一个 QuerySet,您可以稍后将其与其他方法链接或简单地逐步获取结果。

      【讨论】:

        猜你喜欢
        • 2021-11-30
        • 2021-05-31
        • 1970-01-01
        • 2015-12-20
        • 1970-01-01
        • 2011-06-30
        • 2012-12-12
        • 2013-03-05
        • 2019-05-22
        相关资源
        最近更新 更多