Django - 关联的 OneToOne 记录未被删除
Posted
技术标签:
【中文标题】Django - 关联的 OneToOne 记录未被删除【英文标题】:Django - Associated OneToOne Record not being deleted 【发布时间】:2012-09-07 18:24:17 【问题描述】:我有这些模型。问题是当我使用 Django Admin 删除一条狗记录时,关联的项圈记录并没有被删除。
我使用的是 Django 1.2。我认为级联删除是默认设置。将 Collar 链接到旧表有问题吗?
非常感谢。
class Collar(models.Model):
serial_number = models.AutoField(primary_key=True, db_column='serial_number')
weight = models.CharField(max_length=10)
class Meta:
db_table = u'existing_table_from_before_django_was_born'
class Dog(models.Model):
size = models.CharField(max_length=10)
collar = models.OneToOneField(Collar,blank=True, null=True, editable=False)
【问题讨论】:
【参考方案1】:这不是与旧表的连接问题。级联删除将起作用,您删除 Collar 对象,然后相关的 Dog 对象将被删除(可能如果您删除 blank=True,null=True)。
要在删除 Dog 后删除 Collar,需要重载 Dog 的 delete 方法。
【讨论】:
谢谢。由于某种原因,我在往回想。 因此,如果我重写删除方法以首先删除项圈记录然后删除自身,我是否需要以某种方式将删除方法包装在事务中(或者 Django 1.2 会自动执行此操作吗?)。我想避免任何情况下衣领记录会被删除,然后在狗记录也被删除之前遇到错误。 docs.djangoproject.com/en/1.2/topics/db/transactions/…【参考方案2】:您必须考虑关系以及 为什么删除级联存在。 FK 位于Dog
上(该字段位于数据库的表中)。如果您删除Dog
,它只会删除Dog
。没有必要删除任何其他内容。但是,如果您删除 Collar
,那么如果与它关联的 Dog
也没有被删除,那么您可能会遇到引用完整性问题。在您的情况下,该字段可以为 NULL,因此您可以简单地将衣领字段设置为 NULL 并修复参照完整性问题,但在其他情况下,Dog
将 被删除维护数据库的完整性。
删除级联通常非常方便,但重要的是要记住,它的目标不是让您的生活更简单,而是保持数据库的完整性。因此,没有动力去清理关系的另一端(删除Dog
时删除Collar
),因为这不会导致任何问题。
【讨论】:
以上是关于Django - 关联的 OneToOne 记录未被删除的主要内容,如果未能解决你的问题,请参考以下文章