django orm动态建表
import datetime
import os
import sys
import django
sys.path.append("..")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
django.setup()
from django.db import models, OperationalError
def create_model1(name, fields=None, app_label='', module='', options=None):
class Meta:
pass
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)
return type(name, (models.Model,), attrs)
def install(custom_model):
from django.db import connection
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
editor = BaseDatabaseSchemaEditor(connection)
try:
editor.create_model(model=custom_model)
except AttributeError as aerror:
print(aerror)
def create_table(table_name) -> models.Model:
marry_choices = (
(0, '已婚'),
(1, '未婚')
)
fields = {
"name": models.CharField(max_length=30, verbose_name='姓名'),
"id_card_num": models.CharField(max_length=18, verbose_name='身份证号码'),
"gender": models.BooleanField(default=0, verbose_name='性别'),
"age": models.IntegerField(verbose_name='年龄'),
"email": models.CharField(max_length=80, verbose_name='邮箱'),
"address": models.CharField(max_length=1024),
"marry": models.IntegerField(choices=marry_choices, verbose_name='是否已婚'),
"created_at": models.DateTimeField(auto_now_add=True, verbose_name='创建时间'),
"updated_at": models.DateTimeField(auto_now=True, verbose_name='更新时间'),
'__str__': lambda self: '%s' % (
self.name,
), }
options = {'ordering': [
"-created_at"
], 'verbose_name': 'valued customer', }
custom_model = create_model1(name=table_name, fields=fields, options=options, app_label='user',
module='user.models')
try:
install(custom_model)
except OperationalError as e:
print(f'table {table_name} already exists')
return custom_model
if __name__ == '__main__':
date = datetime.datetime.now().strftime("%Y-%m")
User = create_table(f'user_{date}')
print(User.objects.count())