为此(强烈简化)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的情况。
解决这个问题最优雅的方法是什么?
谢谢!
如果我理解正确,你想要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)
qs = C.objects.filter(b__a__in=[a1, a2]) | C.objects.filter(b__a__isnull=True) | C.objects.filter(b__isnull=True)
这将产生完全相同的SQL查询但更冗长...