Django 测试引用某个对象的所有对象是否都有某个“标志”?

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

当我需要测试一个对象是否不再被引用时我可以使用

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 实例中使用”,或者根本没有被引用。

python django orm
1个回答
0
投票

第一步 - 在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

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