Django 过滤一个 ForeignKey 字段为 null
Django filter a ForeignKey field when it is null
假设我在 Django 中有两个表,TableA
和 TableB
。 Table A 包含一些布尔字段,bool
,TableB
包含一个外键字段,for_field
到 TableA
,可以是 Null。
class TableA(models.Model):
bool = models.BooleanField()
class TableB(models.Model):
for_field = models.ForeignKey('TableA', null=True)
如果我想过滤 TableB 以获得 for_field.bool
为 True
或 for_field
为 Null
的所有条目,什么是实现此目标的最短方法?
我正在使用 .filter((Q(for_field__is_null=True) | Q(for_field__bool=True))
,但我想知道是否有更短的代码。
我很确定,您的选择是最短的(如果我错了请纠正我)。那是因为你不能在没有 Q 对象的情况下进行 OR 查询。
经过一些实验,似乎 .exclude(for_field__bool=False)
也将包含 for_field__isnull=True
条目,并且不会引发任何异常。您可以通过执行 .exclude(for_field__bool=False).filter(for_field__isnull=True)
并查看一些结果来确定。
老实说,我不知道哪个选项更快,但我认为你的带有两个 Q
对象的变体更具可读性,因为它显示了你真正想要的逻辑。所以我实际上建议你坚持下去。
假设我在 Django 中有两个表,TableA
和 TableB
。 Table A 包含一些布尔字段,bool
,TableB
包含一个外键字段,for_field
到 TableA
,可以是 Null。
class TableA(models.Model):
bool = models.BooleanField()
class TableB(models.Model):
for_field = models.ForeignKey('TableA', null=True)
如果我想过滤 TableB 以获得 for_field.bool
为 True
或 for_field
为 Null
的所有条目,什么是实现此目标的最短方法?
我正在使用 .filter((Q(for_field__is_null=True) | Q(for_field__bool=True))
,但我想知道是否有更短的代码。
我很确定,您的选择是最短的(如果我错了请纠正我)。那是因为你不能在没有 Q 对象的情况下进行 OR 查询。
经过一些实验,似乎 .exclude(for_field__bool=False)
也将包含 for_field__isnull=True
条目,并且不会引发任何异常。您可以通过执行 .exclude(for_field__bool=False).filter(for_field__isnull=True)
并查看一些结果来确定。
老实说,我不知道哪个选项更快,但我认为你的带有两个 Q
对象的变体更具可读性,因为它显示了你真正想要的逻辑。所以我实际上建议你坚持下去。