【发布时间】:2012-05-04 10:56:10
【问题描述】:
在 django 中处理模型继承时,是否可以删除模型子类的实例,而不删除超类本身?
使用Django example,是否可以只删除Resturaunt 对象并保留Place 对象?
【问题讨论】:
标签: python django django-models django-orm
在 django 中处理模型继承时,是否可以删除模型子类的实例,而不删除超类本身?
使用Django example,是否可以只删除Resturaunt 对象并保留Place 对象?
【问题讨论】:
标签: python django django-models django-orm
昨天我正在寻找这个问题的答案,我想出了这个解决方案,这足以解决我的问题,但可以根据需要扩大规模。
假设您有一个 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 和餐厅将不再存在,地方将保持不变。
干杯, 大卫
【讨论】:
在 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 中不正常工作,请参阅 cmets。
【讨论】: