允许在运行时动态创建和更新数据库架构。
django-dynamic-model的Python项目详细描述
Django动态模型
概述
动态django模型允许用户定义、编辑和填充自己的数据库表,并将运行时模式更改应用于数据库。django动态模型
松散地基于来自djangocon 2011的运行时动态模型谈话。基本概念包括使用内置的类型
函数来声明动态类。我们使用
type
在运行时动态声明新的django模型,本项目的目标是提供一个简单的api,允许开发人员快速开始运行时动态模型。
这个包提供了抽象模型,帮助django开发人员在运行时模式更改和django的模型注册表被自动处理的同时,快速实现其特定用例的动态运行时模型。模式更改应用于纯django,而不使用迁移框架,因此任何动态模型都不会影响迁移文件。
安装
从pypi安装django动态模型
pipinstalldjango-dynamic-model
然后,将'dynamic\u models'
和django.contrib.contenttypes
添加到installed\u apps
注意:
Django的"内容类型"应用程序目前是必需的,不过这种依赖关系可能在将来被删除。
INSTALLED_APPS=[...'dynamic_models','django.contrib.conttenttypes']
用法
首先,只需将abstractmodelschema
和abstractfieldschema
从dynamic\u models.models
中派生出来。如果没有提供额外的字段,抽象模型仍然可以工作。开始使用动态模型的最简单方法是将子类添加到应用程序的models.py
中,然后运行迁移。然后,通过创建模型模式实例和字段模式实例,可以动态创建新模型。
fromdynamic_models.modelsimportAbstractModelSchema,AbstractFieldSchemaclassModelSchema(AbstractModelSchema):passclassFieldSchema(AbstractFieldSchema):pass
现在,运行迁移命令:
$ python manage.py makemigrations
> ... making migrations ...
$ python manage.py migrate
> ... migrating ...
创建动态模型
创建动态模型和创建具体模型模式类的新实例一样简单。AbstractModelSchema
提供单个字段。name
字段将用于生成类名和数据库表的名称。创建后,可以使用as_model
方法检索动态模型类。
注意:
默认情况下,name
字段具有unique=true
帮助强制执行由AbstracModelSchema
实例生成的唯一表名。要使用不同的表命名方案,应该重写db_table
(可能还有model_name
)属性。应注意,不可能从不同的抽象模型模式实例生成相同的数据库表。
默认的model_name将是car
和默认的table_namemyapp_car
其中"myapp"是应用程序标签。表名和模型名来自名称
值。
car_schema=ModelSchema.objects.create(name='car')Car=car_model_schema.as_model()assertissubclass(Car,models.Model)# The dynamic model can now be used to create Car instancesinstance=Car.objects.create()assertinstance.pkisnotNone
添加字段
创建要添加到模型的字段模式与创建动态模型非常相似。abstractfieldschema
提供两个字段,name
和data-type
,它们负责命名数据库列并选择要添加到动态模型中的django字段。字段在创建时不附加到任何动态模型,因此同一字段可以应用于任意数量的动态模型。但是,应用于字段的约束对于每个模型字段对都是特定的。当前支持的数据类型由abstractmodelschema
的子类上的get data\u types
方法返回。目前,支持的数据类型及其相应的django字段类如下所示:
注意:v当不支持数据迁移时,数据类型的值不可编辑。
car_model_schema=ModelSchema.objects.create(name='car')color_field_schema=FieldSchema.objects.create(name='color',data_type='character')
颜色字段仍然完全独立于车型,并且没有添加到任何数据库表中。与普通字符字段一样,必须为字符数据类型定义最大长度。使用add_field
方法向动态模型添加字段
color=car_model_schema.add_field(color_field_schema,null=False,unique=False,max_length=16)
将字段架构附加到模型架构时,可以添加字段约束。现在,新字段可以像在django中一样使用。一定要抓住
更改架构或outdatedmodelerror
后动态模型的最新版本将在保存时引发。
Car=car_model_schema.as_model()red_car=Car.objects.create(color='red')assertred_car.color=='red'# This will raise an error because the 'color' field is requiredanother_car=Car.objects.create()
使用"update_field"将架构更改为允许空。空列当前不能更改为非空,因为需要使用默认值来填充空空格。在实现默认值时,应取消此限制。
可以使用update_field
和remove_field
方法编辑或删除现有字段架构。
car_model_schema.update_field(color_field_schema,null=True)car_model_schema.remove_field(color_field_schema)
支架
name的值决定动态模型的模型名和表名。默认情况下,它应用了 返回由模型架构实例生成的动态模型。 返回所有附加到此模型的modelfieldschema实例。 返回此模型架构和提供的字段架构arugument的 通过创建 用新的约束更新现有字段。当前,不能将字段从 从动态模型中删除一个字段。 如果提供的模型是最新模式的当前模型,则返回 从应用程序注册表和数据库中清除动态模型,而不删除架构实例。手动调用此方法的用例很少。 字段的名称。用于生成数据库列名。名称不应以下划线开头,以免与pri发生潜在冲突在生成的模型上启用属性。 用于确定动态模型上要使用的django模型字段。有关有效数据类型的列表,请参见上文。 返回可用数据类型选项的列表。 将所有相关的模型架构对象标记为已更改,强制在下次调用django动态模型在python 3.6+和django 2.0+上进行测试
参考
抽象模型模式
字段
名称
唯一的
约束,但如果已实现自定义命名方案以防止表和模型名称重复,则可以将其删除。方法
as_model()
获取字段()
为架构获取字段(字段架构)
model field schema
实例。添加字段(字段架构,**选项)
modelfieldschema
的新实例,将字段添加到此动态模型。将字段架构实例作为第一个参数,还可以选择应用于此字段的任何约束。如果字段的数据类型需要,有效约束是null
,unique
,以及max_length
。更新字段(字段架构,**选项)
null=true
更改为null=false
删除字段(字段架构)
是当前的\u型号(型号)
true
;如果自生成模型时起架构已发生更改,则返回false
。这在未保存的架构实例上不起作用。destroy_model()
AbstractFieldSchema
字段
名称
数据类型
方法
获取数据类型()
更新上次修改的内容()
as_model
时重新定义动态模型。推荐PyPI第三方库