5

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

使用Django 示例,您可以仅删除Resturaunt对象并保留Place对象吗?

4

2 回答 2

10

昨天我正在寻找这个问题的答案,我想出了这个解决方案,这对我的问题来说已经足够了,但可以根据需要扩大规模。

假设你有一个 Restaurant 和一个 Place 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 和餐厅将不复存在,地方将保持不变。

干杯,戴维德

于 2012-07-13T07:09:33.873 回答
7

在 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 中无法正常工作,请查看评论。

于 2017-01-25T16:40:03.100 回答