【问题标题】:Django - Associated OneToOne Record not being deletedDjango - 关联的 OneToOne 记录未被删除
【发布时间】: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)

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    这不是与旧表的连接问题。级联删除将起作用,您删除 Collar 对象,然后相关的 Dog 对象将被删除(可能如果您删除 blank=True,null=True)。

    要在删除 Dog 后删除 Collar,需要重载 Dog 的 delete 方法。

    【讨论】:

    • 谢谢。由于某种原因,我在往回想。
    • 因此,如果我重写删除方法以首先删除项圈记录然后删除自身,我是否需要以某种方式将删除方法包装在事务中(或者 Django 1.2 会自动执行此操作吗?)。我想避免任何情况下衣领记录会被删除,然后在狗记录也被删除之前遇到错误。
    【解决方案2】:

    您必须考虑关系以及 为什么删除级联存在。 FK 位于Dog 上(该字段位于数据库的表中)。如果您删除Dog,它只会删除Dog。没有必要删除任何其他内容。但是,如果您删除 Collar,那么如果与它关联的 Dog 也没有被删除,那么您可能会遇到引用完整性问题。在您的情况下,该字段可以为 NULL,因此您可以简单地将衣领字段设置为 NULL 并修复参照完整性问题,但在其他情况下,Dog 被删除维护数据库的完整性。

    删除级联通常非常方便,但重要的是要记住,它的目标不是让您的生活更简单,而是保持数据库的完整性。因此,没有动力去清理关系的另一端(删除Dog 时删除Collar),因为这不会导致任何问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多