假设我们有以下模型。
class A(Model): pass
class B(Model): pass
然后,两者之间没有区别:
在模型A中:
b = OneToOneField(B, related_name=A.__name__)
和
在模型B中:
a = OneToOneField(A, related_name=B.__name__)
因此,我应该问自己哪些问题来决定是否将OTO放在一种或另一种模型中。我的意思是像has-a,is-a等。
最佳答案
实际上,放置一对一字段的地方有所不同,因为删除的行为不同。删除对象时,所有其他具有一对一关系的对象都将被引用。相反,如果删除包含一对一字段的对象(即,它引用其他对象,但其他对象未引用该对象),则不会删除其他对象。
例如:
class A(models.Model):
pass
class B(models.Model):
a = models.OneToOneField(A)
如果删除A,默认情况下也会删除B(尽管您可以通过修改OneToOneField的on_delete参数来覆盖它,就像使用ForeignKey一样)。删除B不会删除A(尽管您可以通过覆盖B的delete()方法来更改此行为)。
回到关于has-a与is-a的最初问题,如果A具有B,则B应该具有一对一字段(B仅在A存在的情况下存在,而A在没有B的情况下可以存在)。
关于django - Django OneToOneField-我应该放在哪个模型中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9800490/