2024-09-27 07:27:37 发布
网友
我有:myARecord=models.OneToOneField(ClassA,…),它由两个不同的类B和C使用
在Django管理中,它允许我创建一个B记录和一个C记录,这两个记录都引用同一个a记录。B或C的两个实例不能像预期的那样引用同一个A记录
如何对B类和C类的所有记录强制执行互斥性
OneToOneField基本上是设置了unique=True的外键,这意味着:
OneToOneField
unique=True
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中
OneToOneField
基本上是设置了unique=True
的外键,这意味着:unique=True
表示该值在整个表中应该是唯一的,这意味着模型ClassB
的两个实例对于指向ClassA
的对象不能具有相同的外键值,但是ClassB
的一个实例对于ClassA
模型可以具有与ClassC
的一个实例相同的外键值,依此类推也就是说,通过这种方式强制执行严格的一对一关系只能在两个表之间执行,而不能在三个表之间执行。在这种情况下,您可以创建一些自定义验证,例如:
但是你必须在你所有的课上都这么做。也许可以创建一个mixin类,并在所有要强制执行该类的类中使用该类
注意:正如Kevin Christopher Henry在注释中指出的,您可能希望将验证保存在^{} method 中
相关问题 更多 >
编程相关推荐