Django在为null时过滤ForeignKey字段

mtc*_*tcg 4 django nullable foreign-keys

假设我在Django中有两个表,TableA并且TableB.表A包含一些布尔字段,boolTableB包含一个外键字段for_fieldto TableA,它可以是Null.

class TableA(models.Model):
    bool = models.BooleanField()

class TableB(models.Model):
    for_field = models.ForeignKey('TableA', null=True)
Run Code Online (Sandbox Code Playgroud)

如果我想过滤表B,以便让所有的条目,其中for_field.boolTruefor_fieldNull,什么是实现这一目标的最短路径?

我正在使用.filter((Q(for_field__is_null=True) | Q(for_field__bool=True)),但我想知道是否有更短的代码.

val*_*tev 7

在一些实验之后,它似乎也.exclude(for_field__bool=False)将包含for_field__isnull=True条目,并且不会引发任何异常.您可以通过执行.exclude(for_field__bool=False).filter(for_field__isnull=True)并查看一些结果来确定.

老实说,我不知道哪个选项更快,但IMO你的两个Q对象的变体更具可读性,因为它显示了你真正想要的逻辑.所以我实际上建议你坚持下去.