假设我们有以下模型。
class A(Model): pass
class B(Model): pass
那么以下之间没有区别:
在模型A中:b = OneToOneField(B, related_name=A.__name__)
and
在模型 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 也会被删除(尽管您可以通过修改on_delete
论点OneToOneField
就像外键 https://docs.djangoproject.com/en/stable/ref/models/fields/#django.db.models.ForeignKey.on_delete)。删除 B 不会删除 A(尽管您可以通过覆盖delete()
方法B)。
回到最初的 has-a 与 is-a 问题,如果 A 有 B,则 B 应该具有一对一字段(B 仅应在 A 存在时才存在,但 A 可以在没有 B 的情况下存在)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)