17

我们可以使用

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

2 回答 2

27

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

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

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

您还可以使用该Q对象直接在以下位置指定过滤器.get

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

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

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

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

...你可以简单地做:

MyClass.objects.get(status='unknown', description='hi')
于 2013-08-13T07:07:54.893 回答
1

你想要:

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

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

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

于 2013-08-13T06:53:08.670 回答