Python 继承模型更新到其父模型
我需要从另一个模型扩展一个模型 案例: core/models.py 自定义/models.py 自定义是一个应用程序 我尝试过使用代理模型,但这不是我所需要的,因为代理模型添加了一个新表 我需要的是,当我迁移时,将新字段添加到城市 更多信息。 在core中创建表,在custom中,您可以添加客户端需要的新字段。其思想是核心仅作为标准维护Python 继承模型更新到其父模型,python,django,django-inheritance,Python,Django,Django Inheritance,我需要从另一个模型扩展一个模型 案例: core/models.py 自定义/models.py 自定义是一个应用程序 我尝试过使用代理模型,但这不是我所需要的,因为代理模型添加了一个新表 我需要的是,当我迁移时,将新字段添加到城市 更多信息。 在core中创建表,在custom中,您可以添加客户端需要的新字段。其思想是核心仅作为标准维护 代理模型不添加新表。从: MyPerson类在与其父Person类相同的数据库表上操作 如果希望一个表名为core\u city,另一个表名为custom\u
代理模型不添加新表。从: MyPerson类在与其父Person类相同的数据库表上操作 如果希望一个表名为
core\u city
,另一个表名为custom\u city
,第二个表有一个额外的字段,只需将其子类化即可。也许使用别名会更容易:
from core.models import City as CoreCity
class City(CoreCity):
newfield = models.CharField(max_length=20)
custom\u city
将包含来自core\u city
的所有字段,以及一个newfield
。文档部分介绍了这一工作原理(以及一个示例)
如果您希望有一个单个数据库表,那么您应该使用代理模型,但是它们实际上不允许您创建新字段。该字段应该在父模型中创建,或者存在于数据库中,而不是由Django迁移处理。您正在寻找模型:
当您想要将一些公共信息放入许多其他模型中时,抽象基类非常有用。您编写基类并将abstract=True放入元类中
这是基类:
#core/models.py
班级城市(硕士):
zipcode=models.IntegerField()
类元:
abstract=True#您可以在类常量定义后更新或创建类常量,如下所示
来自core.models导入城市
City.newfield=models.CharField(最大长度=20)
您可能需要使用可交换模型,使用它们您可以定义一个城市类别,并在以后使用您需要的任何模型进行更改,
但是,这样您就不能直接导入和使用基本城市模型,您可能需要为此提供一个像get_City_model这样的方法,作为您的公共API
class City(Master):
zipcode = models.IntegerField()
class Meta:
swappable = 'CORE_CITY_MODEL'
以后可能会用其他模型替换它,然后以“app\u name.model\u name”的形式将CORE\u CITY\u model设置为该模型
< django.Curb.Auth>是一个很好的例子,您可以考虑检查<代码>用户<代码>模型和<代码> GETUSUREL模型方法。虽然我认为如果在运行“迁移”后更改城市模型,您可能会遇到问题,但它可能不会将数据移动到新表中,但我不确定这一点。Master是代理模型,请澄清它。它不是这样工作的,因为它创建了一个带有app后缀的新表,现在我有两个表core_City和custom_CityMaster是一个抽象模型;大师。城市是一个代理(代理什么?)。听起来像大师。城市也应该是抽象的(见@dani herrera的答案)。城市不能是抽象的,因为只有当客户需要添加新行时,它才会被修改。其目的是创建一个具有标准化业务逻辑的标准表的核心项目,并且只有在定制中,客户才能添加他需要的内容(如果是这样的话)。好的,请继续我回答的第二部分,其中说“如果您想要的是一个数据库表…”。Django无法进行迁移以在代理表中添加字段。您可以手动执行此操作(例如使用migrations.RunSQL()
),但您必须对其进行维护。我已经读过相关内容,但问题是,如果未在模型中声明,我将无法与字段交互。City不能是抽象表。例如,客户端需要一个新行CityShortName,要做到这一点,客户端需要创建一个新的应用程序并在那里进行自定义。可能在同一个应用程序中,abstract\u models.py
和models.py
。我在这里这样做:Dani,在core中创建表,在customd中,您可以添加客户端需要的新字段。这个想法是核心只是作为标准来维护的。和我在示例中做的一样,只是有两个应用程序,而不是一个。我要做的是编写自定义scheleton,使用pass
作为模型体。城市不能是抽象的。我尝试过,但makemigrations没有检测到更改
from core.models import City as CoreCity
class City(CoreCity):
newfield = models.CharField(max_length=20)
class City(Master):
zipcode = models.IntegerField()
class Meta:
swappable = 'CORE_CITY_MODEL'