当我需要测试一个对象是否不再被引用时我可以使用
class ModelA(models.Model):
pass
class ModelB(models.Model):
retired = models.BooleanField(default=False)
modelA = models.ForeignKey(
ModelA,
)
ModelA.objects.filter(~Q(modelb__isnull=False))
使用否定和测试 False 的“奇怪”格式确保创建 Exists 语句而不是子查询或联接。
但是,我如何测试“ModelA 仅在已退休=True 的 ModelB 实例中使用”,或者根本没有被引用。
第一步 - 在ForeignKey字段中使用related_name。
class ModelB(models.Model):
retired = models.BooleanField(default=False)
modelA = models.ForeignKey(
ModelA,
related_name="modelb"
)
第二步 - 在过滤器中使用所需的东西
# if u need not-retired modelb
ModelA.objects.filter(modelb__isnull=False, modelb__retired=False)
# if u need retired or null-retired variant 1
ModelA.objects.filter(modelb_isnull=False, modelb__retired__in=(True, None))
# if u need retired or null-retired variant 2
ModelA.objects.filter(modelb_isnull=False).exclude(modelb__retired=False)
我建议读者,始终使用 related_name