Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 继承模型更新到其父模型_Python_Django_Django Inheritance - Fatal编程技术网

Python 继承模型更新到其父模型

Python 继承模型更新到其父模型,python,django,django-inheritance,Python,Django,Django Inheritance,我需要从另一个模型扩展一个模型 案例: core/models.py 自定义/models.py 自定义是一个应用程序 我尝试过使用代理模型,但这不是我所需要的,因为代理模型添加了一个新表 我需要的是,当我迁移时,将新字段添加到城市 更多信息。 在core中创建表,在custom中,您可以添加客户端需要的新字段。其思想是核心仅作为标准维护 代理模型不添加新表。从: MyPerson类在与其父Person类相同的数据库表上操作 如果希望一个表名为core\u city,另一个表名为custom\u

我需要从另一个模型扩展一个模型

案例:

core/models.py

自定义/models.py

自定义是一个应用程序

我尝试过使用代理模型,但这不是我所需要的,因为代理模型添加了一个新表

我需要的是,当我迁移时,将新字段添加到城市

更多信息。 在core中创建表,在custom中,您可以添加客户端需要的新字段。其思想是核心仅作为标准维护


代理模型不添加新表。从:

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'