Django ORM:将exclude与not结合使用

问题描述 投票:0回答:1

为此(强烈简化)Django模型设置:

class A(models.Model)

class B(models.Model)
  a = models.ForeignKey(A, null=True, blank=True)

class C(models.Model)
  b = models.ForeignKey(B, null=True, blank=True)

我想确保对于C上的查询,没有[a1,a2]的相关对象是查询的一部分。

就像是:

qs = C.objects.exclude(b__a__NOT_in=[a1, a2]).

我正在寻找的不是

qs = C.objects.filter(b__a__in=[a1, a2])

因为我的外键可以为空,我还想获取其中任何fks为null的情况。

解决这个问题最优雅的方法是什么?

谢谢!

django django-orm
1个回答
2
投票

如果我理解正确,你想要b为null或b__a为null的C实例或b__a(a1, a2)之一。这里可能的解决方案是use the models.Q object构建一个or查询,即:

from django.db.models import Q

query = Q(b__a__in=[a1, a2]) | Q(b__a__isnull=True) | Q(b__isnull=True)
qs = C.objects.filter(query)

或只是"OR" querysets directly

qs = C.objects.filter(b__a__in=[a1, a2]) | C.objects.filter(b__a__isnull=True) | C.objects.filter(b__isnull=True)

这将产生完全相同的SQL查询但更冗长...

© www.soinside.com 2019 - 2024. All rights reserved.