【django模型】为数据库添加【表注释】【字段注释】【字段默认值】【日期默认值】

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()

在这里插入图片描述

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WaiSaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值