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 记录未被删除的主要内容,如果未能解决你的问题,请参考以下文章

django之跨表查询及添加记录

Django之跨表查询及添加记录

django之跨表查询及添加记录

一对一关联查询注解@OneToOne的实例详解

Django学习第7篇:Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)

Django 中的 OneToOne、ManyToMany 和 ForeignKey 字段有啥区别?