【发布时间】:2013-08-13 06:49:52
【问题描述】:
我们可以使用
MyClass.objects.get(description='hi').exclude(status='unknown')
【问题讨论】:
标签: python django django-models
我们可以使用
MyClass.objects.get(description='hi').exclude(status='unknown')
【问题讨论】:
标签: python django django-models
如果您在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')
【讨论】:
你想要:
MyClass.objects.filter(description='hi').exclude(status='unknown')
.get() 将引发 MultipleObjectsReturned 如果您的查询导致多个匹配集;考虑到您正在搜索不是主键的内容,这很可能会发生。
使用过滤器将为您提供一个 QuerySet,您可以稍后将其与其他方法链接或简单地逐步获取结果。
【讨论】: