Python 将模型转换为其基础模型

Python 将模型转换为其基础模型,python,django,inheritance,django-models,Python,Django,Inheritance,Django Models,考虑以下文件: from django.db import models class Place(models.Model): name = models.CharField(max_length=50) address = models.CharField(max_length=80) class Restaurant(Place): serves_hot_dogs = models.BooleanField(default=False) serves_pi

考虑以下文件:

from django.db import models

class Place(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=80)

class Restaurant(Place):
    serves_hot_dogs = models.BooleanField(default=False)
    serves_pizza = models.BooleanField(default=False)
现在,让我们假设我有一家
餐厅
,名为
餐厅
。但是这个地方不再是餐馆了,所以我想把它改造成一个地方。为此,我愿意:

p = Place.objects.get(pk=place_id)
p.restaurant.delete()
p.save()
它工作得很好,
p
不再是一家餐厅,但奇怪的事情发生了:Place表中
p
的主键(ID)发生了更改,就像删除了位置然后重新创建一样

为什么会这样?
我如何在不改变地点ID的情况下将我的餐馆转换成一个地点?

您从
place
继承了
restaurant
,并且
Django
对DB中两个表之间的这种关系做了一些处理。Django调用了
多表继承。
此类设计的一些特点包括:

  • 两个对象的主键相同
  • Django观点中的两个对象似乎是一个对象,因此一个对象的
    PK
    中的每一个更改都会导致另一个对象的自动更改
  • 两个模型之间存在自动创建的OneToOneField
  • 关系
  • 这些对象中有用于查询的原子事务
    这是Django ORM和Django管理这两个对象的
    PK
    中的更改的正常行为。你可以阅读更多关于这个概念的代码>具体模型< /代码>和<代码>多表继承< /代码>。

    在哪里<代码> PosithId<代码>来自?@ LISBY从一种形式,认为我有这个地方,我知道它是一家餐馆。