允许在运行时动态创建和更新数据库架构。

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

< Buff行情>

注意

Django的"内容类型"应用程序目前是必需的,不过这种依赖关系可能在将来被删除。

INSTALLED_APPS=[...'dynamic_models','django.contrib.conttenttypes']

用法

首先,只需将abstractmodelschemaabstractfieldschemadynamic\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方法检索动态模型类。

< Buff行情>

注意

默认情况下,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提供两个字段,namedata-type,它们负责命名数据库列并选择要添加到动态模型中的django字段。字段在创建时不附加到任何动态模型,因此同一字段可以应用于任意数量的动态模型。但是,应用于字段的约束对于每个模型字段对都是特定的。当前支持的数据类型由abstractmodelschema的子类上的get data\u types方法返回。目前,支持的数据类型及其相应的django字段类如下所示:

< Buff行情>

注意:v当不支持数据迁移时,数据类型的值不可编辑。

<表><广告>数据类型 django字段< /广告><正文>字符字符域文本文本字段整数积分字段浮动浮动字段布尔值布尔字段日期日期时间字段
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_fieldremove_field方法编辑或删除现有字段架构。

car_model_schema.update_field(color_field_schema,null=True)car_model_schema.remove_field(color_field_schema)

支架

django动态模型在python 3.6+和django 2.0+上进行测试


参考

抽象模型模式

字段

名称

name的值决定动态模型的模型名和表名。默认情况下,它应用了唯一的约束,但如果已实现自定义命名方案以防止表和模型名称重复,则可以将其删除。


方法

as_model()

返回由模型架构实例生成的动态模型。


获取字段()

返回所有附加到此模型的modelfieldschema实例。


为架构获取字段(字段架构)

返回此模型架构和提供的字段架构arugument的model field schema实例。


添加字段(字段架构,**选项)

通过创建modelfieldschema的新实例,将字段添加到此动态模型。将字段架构实例作为第一个参数,还可以选择应用于此字段的任何约束。如果字段的数据类型需要,有效约束是nullunique,以及max_length


更新字段(字段架构,**选项)

用新的约束更新现有字段。当前,不能将字段从null=true更改为null=false


删除字段(字段架构)

从动态模型中删除一个字段。


是当前的\u型号(型号)

如果提供的模型是最新模式的当前模型,则返回true;如果自生成模型时起架构已发生更改,则返回false。这在未保存的架构实例上不起作用。


destroy_model()

从应用程序注册表和数据库中清除动态模型,而不删除架构实例。手动调用此方法的用例很少。


AbstractFieldSchema

字段

名称

字段的名称。用于生成数据库列名。名称不应以下划线开头,以免与pri发生潜在冲突在生成的模型上启用属性。


数据类型

用于确定动态模型上要使用的django模型字段。有关有效数据类型的列表,请参见上文。


方法

获取数据类型()

返回可用数据类型选项的列表。


更新上次修改的内容()

将所有相关的模型架构对象标记为已更改,强制在下次调用as_model时重新定义动态模型。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
尝试运行JFLAP。戴软呢帽的罐子23。Java正在抛出异常   无引用的java数组布尔复制   hibernate如何在java SE应用程序中使用JPA EntityManager   java如何使用ORMLite在SQLite中持久化JavaFX属性?   java无法将项目部署到GAE   java:谷歌地图维基百科层   java Resultset(getter/setter类)对象在第二次执行时未删除旧值   s中的java struts2:选择列表>请求的列表键“”作为集合/数组/映射/枚举/迭代器类型   java如何在Karaf 4.0.5中获得BaseDao中的entityManager?   java VSCode未从控制台读取西里尔文   java字体。createFromAsset()返回字体的空指针异常   java错误:将Android Studio从0.6.1更新到0.8.9后,没有合适的构造函数