django dynamic model
django model
首先对于一个习惯用django model的骚年来说,你肯定对django model自定制用的很熟悉,但突然让你用django dynamic model,也许会有很多人懵逼,然后各种查官网,看论坛,翻源码,终于搞出了。不过对于我们这些新手来说是相当吃力的。现在整理出来方便日后观看。
对于什么是django model 的定义就不多说
create table
在动态创建之前,应该先了解一下makemigrations以及migrate 的源码,先看看他们是如何生成的。下面是自己测试成功代码,仅供参考
from django.db import connection, migrations, models
from django.db.migrations.executor import MigrationExecutor def create_table(table_name, model_fields, app_label):
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name='a',
fields=[
('title', models.CharField(choices=[('MR', 'Mr.'), ('MRS', 'Mrs.'), ('MS', 'Ms.')], max_length=3)),
('birth_date', models.DateField(blank=True, null=True)),
],
),
migrations.CreateModel(
name='b',
fields=[
('id', models.AutoField(auto_created=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100)),
('authors', models.ManyToManyField(to='app.a', related_name='author')),
],
),
migrations.CreateModel(
name='c',
fields=[
('id', models.AutoField(auto_created=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=32)),
('data', models.CharField(db_index=True, max_length=32)),
],
),
]
executor = MigrationExecutor(connection)
migration = Migration(table_name, app_label)
with connection.schema_editor(atomic=True) as schema_editor:
migration.apply(executor._create_project_state(), schema_editor)
执行代码
custom_model = create_table('example', fields,
app_label='app',
)
注意 fields可自定制
执行成功后,你会发现你的数据表里多了这几个表
此时可不能万事大吉,怎么去操作也是很重要的。
操作danamic model
def get_model(name, fields=None, app_label=None, module='', options=None, admin_opts=None):
"""
Create specified model
"""
class Meta:
db_table = name
if app_label:
setattr(Meta, 'app_label', app_label)
if options is not None:
for key, value in options.items():
setattr(Meta, key, value)
attrs = {'__module__': module, 'Meta': Meta}
if fields:
attrs.update(fields) model = type(name, (models.Model,), attrs)
return model
执行 get_model
al = dict(
title=models.CharField(choices=[('MR', 'Mr.'), ('MRS', 'Mrs.'), ('MS', 'Ms.')], max_length=3),
birth_date=models.DateField(blank=True, null=True)
)
model_a = get_model('app_a', app_label='app', fields=al)
注意此时al 为你动态创建的model 字段,此时你获取该model时需要将字段传进去
而这此时也只是对单表操作,如果遇到manytomany呢?
那么别急,肯定会有解决的办法
哈哈
model_a = get_model('app_a', app_label='app', fields=al)
fields = dict(
name=models.CharField(max_length=100),
authors=model_a
)
modelb = get_model('app_b', app_label='app', fields=fields)
obj = modelb.objects.filter(id=1).first()
print(obj)
a = obj.authors.objects.values('title')
print(a)
即:如果你要正向操作,针对上面创建得表,你首先创建a表的类型,然后将a类型作为authors的参数传进去即可。
现在就一切OK了,
django dynamic model的更多相关文章
- Django之Model操作
Django之Model操作 本节内容 字段 字段参数 元信息 多表关系及参数 ORM操作 1. 字段 字段列表 AutoField(Field) - int自增列,必须填入参数 primary_ke ...
- Django的Model上都有些什么
Django的Model上都有些什么 modelinfo= ['DoesNotExist', 'MultipleObjectsReturned', '__class__', '__delattr__' ...
- Python之路【第二十二篇】:Django之Model操作
Django之Model操作 一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bi ...
- django User model
django User model operation this tutorial will guide us to know how to manipulate django User model. ...
- Scrapy中使用Django的Model访问数据库
Scrapy中使用Django的Model进行数据库访问 当已存在Django项目的时候,直接引入Django的Model来使用比较简单 # 使用以下语句添加Django项目的目录到path impo ...
- django使用model创建数据库表使用的字段
Django通过model层不可以创建数据库,但可以创建数据库表,以下是创建表的字段以及表字段的参数.一.字段1.models.AutoField 自增列= int(11) 如果没有的话,默认会生成一 ...
- Django之Model组件
Model组件在django基础篇就已经提到过了,本章介绍更多高级部分. 一.回顾 1.定义表(类) ##单表 from django.db import models class user(mode ...
- django中将model转换为dict的方法
django中将model转换为dict的方法 from django.forms.models import model_to_dict from user.model import userpro ...
- Python学习---django之Model语法180124
django之Model语法[Models] 1 django默认支持sqlite,mysql, oracle,postgresql数据库. <1> sqlite django默认使 ...
随机推荐
- 【机器学习基石笔记】七、vc Dimension
vc demension定义: breakPoint - 1 N > vc dimension, 任意的N个,就不能任意划分 N <= vc dimension,存在N个,可以任意划分 只 ...
- 【git】新建一个git仓库的方法
1.在github上登陆,新建一个远程仓库 2.在本地创建仓库 3.本地仓库关联到远程仓库 git remote add origin(仓库名) git@github.com:yesuuu/test. ...
- react 学习文章
生命周期 学习笔记 一些坑 项目完成后总结 理解Immutable 是否要同构如何同构 react组件最佳实践 redux集合所有的state props来源, 页面所有状态 数据的唯一来源 reac ...
- Arcgis for Js实现graphiclayer的空间查询
本节讲的是Arcgis for Js的针对graphiclayer的空间查询,内容很简单,代码如下: <!DOCTYPE html> <html> <head> & ...
- 机器学习算法实现解析——libFM之libFM的模型处理部分
本节主要介绍的是libFM源码分析的第三部分--libFM的模型处理. 3.1.libFM中FM模型的定义 libFM模型的定义过程中主要包括模型中参数的设置及其初始化,利用模型对样本进行预测.在li ...
- Wordpress在主题或者插件中自定义存储附件的方法
1.前端使用form表单 //单文件上传,我的业务需求中限制了必须上传图片 <input type="file" name="singlename" ac ...
- net core集成CAP
net core集成CAP https://www.cnblogs.com/guolianyu/p/9756941.html 一.前言 感谢杨晓东大佬为社区贡献的CAP开源项目,传送门在此:.NET ...
- Python笔记-2
一.列表的定义及操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作. 1.列表的格式及赋值 列表,使用中括号括起来,元素之间用逗号隔开,列表中的元素具有明确的位 ...
- js对象原型链
JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象.这个对象的所有属性和方法,都会被构造函数的所拥有. 这也就意味着,我们可以把所有对象实例需要共享的属性和方 ...
- django配置静态文件
django配置静态文件 参考文章链接:http://blog.csdn.net/hireboy/article/details/8806098