django动态创建模型

应用场景,对于数据分表查询的时候,非常有用,比如历史某些数据比较大,每个月一个表,这就需要用到动态加载表。

# -*- coding: utf-8 -*-
from django.contrib import admin
from django.db import models

def create_model(model_name,  app_label='', fields=None, module='', meta_options=None, admin_options=None):
    """
    Create specified model
    """
    class Meta:
        # Using type('Meta', ...) gives a dictproxy error during model creation
        pass

    if app_label:
        # app_label must be set using the Meta inner class
        setattr(Meta, 'app_label', app_label)

    # Update Meta with any options that were provided
    if meta_options is not None:
        for key, value in meta_options.iteritems():
            setattr(Meta, key, value)

    # Set up a dictionary to simulate declarations within a class
    attrs = {'__module__': module, 'Meta': Meta}

    # Add in any fields that were provided
    if fields:
        attrs.update(fields)

    # Create the class, which automatically triggers ModelBase processing
    model = type(model_name, (models.Model,), attrs)

    # Create an Admin class if admin options were provided
    if admin_options is not None:
        class Admin(admin.ModelAdmin):
            pass
        for key, value in admin_options.items():
            setattr(Admin, key, value)
        admin.site.register(model, Admin)

    return model

 举例子

#-*- coding: utf-8 -*-
from app1 import dynamic_models
from django.db import models
from django.apps import apps

def create_user_model():
    #字段类型
    FIELD_TYPES = {
        "CharField": models.CharField,
    }

    model_name = "User"
    app_label = "app1"
    meta_options = {}
    admin_options = {}
    fields = [
        {
            "name":"name",
            "field_type":"CharField",
            "options":dict(
                verbose_name=u"用户",
                db_index = True,
                max_length=50,
                null=True,
                blank=True,
                help_text = u"操作的用户2"
            )
        },
        {
            "name":"sex",
            "field_type":"CharField",
            "options":dict(
                verbose_name=u"用户",
                db_index = True,
                max_length=50,
                null=True,
                blank=True,
                help_text = u"sex"
            )
        }
    ]
    model_fields = {}
    for f in fields:
        field_klass  = FIELD_TYPES[f["field_type"]]

        model_fields[f["name"]] = field_klass(**f["options"])

    try:
        MyKlass = apps.get_model(app_label,model_name)
    except LookupError as e:
        MyKlass = dynamic_models.create_model(
            model_name = model_name,
            app_label = app_label,
            fields = model_fields,
            module= app_label,
            meta_options = meta_options,
            admin_options = admin_options,
        )

    return MyKlass

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值