Background

django模型定义的orm类明明都添加了默认值、表注释、字段注释,但迁移后在数据库中生成的表中却没有。这里我们通过修改Django源代码,支持表注释、字段注释和字段默认值。

  • 修改前
    在这里插入图片描述

  • 修改后
    在这里插入图片描述

  • 用户模型
    在这里插入图片描述

1、找到配置文件 schema.py

这个文件所在的目录:{python3安装目录}/Lib\site-packages\django\db\backends\base\schema.py
这是我的:D:\software\python3.7.8\Lib\site-packages\django\db\backends\base\schema.py

在这里插入图片描述
在这里插入图片描述

2、修改table_sqlcolumn_sql函数

  • table_sql
# 【wlf-2021-1103】添加mysql表注释
if self.connection.client.executable_name == 'mysql' and model._meta.verbose_name:
    sql += " COMMENT '%s'" % model._meta.verbose_name

在这里插入图片描述

  • column_sql
# 【wlf-2021-1103】添加字段默认值和字段注释
exec_name = self.connection.client.executable_name
field_name = field.name
field_default_value = field.default
field_verbose_name = field.verbose_name
name_include = ['create_time', 'update_time']
if exec_name == 'mysql' and (field_default_value != NOT_PROVIDED and not callable(field_default_value) 
                             and not isinstance(field_default_value, bool)) or field_name in name_include:
    if field_name == 'create_time':
        sql = sql.replace('datetime(6)', 'datetime').replace('NOT NULL', 'DEFAULT CURRENT_TIMESTAMP')
    elif field_name == 'update_time':
        sql = sql.replace('datetime(6)', 'datetime').replace('NOT NULL', 'DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP')
    else:
        sql += " DEFAULT '%s'" % str(field_default_value)
if exec_name == 'mysql' and field_verbose_name:
    sql += " COMMENT '%s'" % field_verbose_name

在这里插入图片描述

3、清除django缓存,重新迁移就行了,这里给个初始化脚本

import os
import shutil

from yl_pms import utils


def print_info(msg):
    """打印信息"""
    print("< {} >".format(msg).center(80, "="))
    print('')


def init():
    # 创建数据模型
    cmd1 = 'python manage.py makemigrations'
    os.system(cmd1)
    msg = 'virtual model create success'
    print_info(msg)

    # 创建真实的数据表
    cmd2 = 'python manage.py migrate'
    os.system(cmd2)
    msg = 'real model create success'
    print_info(msg)

    # 创建超级管理员
    msg = '\033[1;32;41mPlease run the following command to create a superuser manually !\033[0m'
    print(msg)
    cmd3 = 'python manage.py createsuperuser'
    msg = '\033[4;34;34m{}\033[0m'.format(cmd3)
    print_info(msg)


def rm_cache():
    """删除缓存"""
    cache_dir = 'pms/migrations/'
    dir_rm = '__pycache__'
    str1_rm = 'initial.py'
    str2_rm = '_auto_'
    li = os.listdir(cache_dir)
    for f in li:
        if dir_rm == f:
            shutil.rmtree(cache_dir + dir_rm)
        elif str1_rm in f or str2_rm in f:
            os.remove(cache_dir + f)
    msg = 'cache rm success'
    print_info(msg)


if __name__ == '__main__':
    """该脚本需要和manage.py在同一目录"""
    # utils.MysqlUtil.del_db()
    utils.MysqlUtil.create_db()
    rm_cache()
    init()

在这里插入图片描述

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐