如何使Django的OneToOneField在不同类之间相互排斥

2024-09-27 07:27:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有:myARecord=models.OneToOneField(ClassA,…),它由两个不同的类B和C使用

在Django管理中,它允许我创建一个B记录和一个C记录,这两个记录都引用同一个a记录。B或C的两个实例不能像预期的那样引用同一个A记录

如何对B类和C类的所有记录强制执行互斥性


Tags: django实例models记录强制执行onetoonefieldclassa互斥性
1条回答
网友
1楼 · 发布于 2024-09-27 07:27:37

OneToOneField基本上是设置了unique=True的外键,这意味着:

  1. 因为它是一个外键,所以它所引用的实例也可以被作为外键值的其他实例引用
  2. unique=True表示该值在整个表中应该是唯一的,这意味着模型ClassB的两个实例对于指向ClassA的对象不能具有相同的外键值,但是ClassB的一个实例对于ClassA模型可以具有与ClassC的一个实例相同的外键值,依此类推

也就是说,通过这种方式强制执行严格的一对一关系只能在两个表之间执行,而不能在三个表之间执行。在这种情况下,您可以创建一些自定义验证,例如:

class ClassB(models.Model):
    a_reference = models.OneToOneField(ClassA)

    def save(self, *args, **kwargs):
        class_c_instances_with_same_value = ClassC.objects.filter(a_reference=self.a_reference)
        if class_c_instances_with_same_value:
            raise ValidationError
        super(ClassB, self).save(*args, **kwargs)

但是你必须在你所有的课上都这么做。也许可以创建一个mixin类,并在所有要强制执行该类的类中使用该类

注意:正如Kevin Christopher Henry在注释中指出的,您可能希望将验证保存在^{} method

相关问题 更多 >

    热门问题