Django模型继承:删除子类保持超类

时间:2012-04-23 19:45:04

标签: python django django-models django-orm

在django中处理whith模型继承时,是否可以删除模型子类的实例,而无需删除超类本身?

使用Django example,您是否可以仅移除Resturaunt对象并保留Place对象?

2 个答案:

答案 0 :(得分:10)

昨天我一直在寻找这个问题的答案,我想出了这个解决方案,这对我的问题已经足够了,但可以根据需要进行扩展。

假设你有一个餐厅和一个地方django模型,只有在没有触及Place餐桌内的行的情况下删除餐馆的方法就是创建一个像这样的“假”餐厅模型:

class FakeRestaurant(models.Model):
    place_ptr = models.PositiveIntegerField(db_column="place_ptr_id", primary_key=True)
    serves_hot_dogs = models.BooleanField()
    serves_pizza = models.BooleanField()

    class Meta:
        app_label = Restaurant._meta.app_label
        db_table = Restaurant._meta.db_table
        managed = False

现在,您可以从该表中检索对象,就像它没有绑定的外部关系一样:

place = Place.objects.get(pk=1)
restaurant = Restaurant.objects.get(pk=1)
fake_restaurant = FakeRestaurant.objects.get(pk=1)
fake_restaurant.delete()

fake_restaurant和restaurant将不再存在,地点将保持不变。

干杯, 的Davide

答案 1 :(得分:3)

在Django 1.9中,参数keep_parents被添加到模型delete()函数中,所以为了让父母只需要调用:

restaurant.delete(keep_parents=True)

文档:https://docs.djangoproject.com/en/1.10/ref/models/instances/#django.db.models.Model.delete

<强>更新

显然,这个功能在Django 1.9中正常工作,请参阅评论。