【问题标题】:Django model inheritance: Delete subclass keep superclassDjango模型继承:删除子类保留超类
【发布时间】:2012-05-04 10:56:10
【问题描述】:

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

使用Django example,是否可以只删除Resturaunt 对象并保留Place 对象?

【问题讨论】:

    标签: python django django-models django-orm


    【解决方案1】:

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

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

    干杯, 大卫

    【讨论】:

    • 请注意 Meta 类中的“托管”选项设置为 True
    • 我的意思是,设置为 False。编辑器没有保留正确的缩进。谢谢:D
    【解决方案2】:

    在 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。

    【讨论】:

    • 我刚试过这个,在 1.9 的实现中似乎有一个错误。与父对象的所有关系都将被删除。这已在以后的版本中修复code.djangoproject.com/ticket/27407
    猜你喜欢
    • 2015-03-05
    • 2012-04-06
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多