2012-09-07 61 views
0

我有这些模型。问题是,当我使用Django Admin删除一条狗记录时,相关的项圈记录没有被删除。Django - 关联OneToOne记录未被删除

我在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) 

回答

2

这不是连接到遗留表的问题。删除级联删除将删除Collar对象,然后相关的Dog对象将被删除(可能是删除了blank = True,null = True)。

删除Dog后删除Collar你需要重载Dog的删除方法。

+0

谢谢。出于某种原因,我在思考着什么。 – Greg

+0

因此,如果我重写删除方法以首先删除领圈记录,然后删除自己,我需要以某种方式将删除方法包装在一个事务中(或Django 1.2会自动执行该操作吗?)。我想避免所有领圈记录被删除但在Dog记录被删除之前发生错误的情况。 – Greg

+0

https://docs.djangoproject.com/en/1.2/topics/db/transactions/#django-db-transaction-commit-on-success –

2

你必须考虑关系和为什么删除级联存在。 FK位于Dog(该字段位于DB中的表格中)。如果删除Dog,它只会删除Dog。没有必要删除其他任何东西。但是,如果您删除Collar,则可能如果与其关联的Dog未被删除,则最终会遇到参照完整性问题。在你的情况下,这个字段是NULL-able,所以你可以简单地将领域设置为NULL并修复参照完整性问题,但在其他情况下,Dog删除以维护数据库完整性。

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