智慧水务项目(二)django(drf)+angular 18 创建通用model,并对orm常用字段进行说明

news2024/9/20 16:38:11

一、说明

上一篇文章建立一个最简单的项目,现在我们建立一个公共模型,抽取公共字段,以便于后续模块继承,过程之中会对orm常用字段进行说明,用到的介绍一下

二、创建一个db.py

目录如下图

1、代码 

from importlib import import_module

from django.apps import apps
from django.db import models
from smartwater import settings
from django.conf import settings

table_prefix = settings.TABLE_PREFIX


class BaseModel(models.Model):
    """
    抽象公共模型,可以直接继承使用
    增加审计字段, 覆盖字段时, 字段名称请勿修改, 必须统一审计字段名称
    """
    id = models.BigAutoField(primary_key=True, help_text="Id", verbose_name="Id")
    description = models.CharField(max_length=255, verbose_name="描述", null=True, blank=True, help_text="描述")
    creator = models.ForeignKey(to=settings.AUTH_USER_MODEL, related_query_name='creator_query', null=True,
                                verbose_name='创建人', help_text="创建人", on_delete=models.SET_NULL,
                                db_constraint=False)
    modifier = models.CharField(max_length=255, null=True, blank=True, help_text="修改人", verbose_name="修改人")
    dept_belong_id = models.CharField(max_length=255, help_text="数据归属部门", null=True, blank=True,
                                      verbose_name="数据归属部门")
    update_datetime = models.DateTimeField(auto_now=True, null=True, blank=True, help_text="修改时间",
                                           verbose_name="修改时间")
    create_datetime = models.DateTimeField(auto_now_add=True, null=True, blank=True, help_text="创建时间",
                                           verbose_name="创建时间")

    class Meta:
        abstract = True
        verbose_name = '核心模型'
        verbose_name_plural = verbose_name


def get_all_models_objects(model_name=None):
    """
    获取所有 models 对象
    :return: {}
    """
    settings.ALL_MODELS_OBJECTS = {}
    if not settings.ALL_MODELS_OBJECTS:
        all_models = apps.get_models()
        for item in list(all_models):
            table = {
                "tableName": item._meta.verbose_name,
                "table": item.__name__,
                "tableFields": []
            }
            for field in item._meta.fields:
                fields = {
                    "title": field.verbose_name,
                    "field": field.name
                }
                table['tableFields'].append(fields)
            settings.ALL_MODELS_OBJECTS.setdefault(item.__name__, {"table": table, "object": item})
    if model_name:
        return settings.ALL_MODELS_OBJECTS[model_name] or {}
    return settings.ALL_MODELS_OBJECTS or {}


def get_model_from_app(app_name):
    """获取模型里的字段"""
    model_module = import_module(app_name + '.models')
    filter_model = [
        getattr(model_module, item) for item in dir(model_module)
        if item != 'CoreModel' and issubclass(getattr(model_module, item).__class__, models.base.ModelBase)
    ]
    model_list = []
    for model in filter_model:
        if model.__name__ == 'AbstractUser':
            continue
        fields = [
            {'title': field.verbose_name, 'name': field.name, 'object': field}
            for field in model._meta.fields
        ]
        model_list.append({
            'app': app_name,
            'verbose': model._meta.verbose_name,
            'model': model.__name__,
            'object': model,
            'fields': fields
        })
    return model_list


def get_custom_app_models(app_name=None):
    """
    获取所有项目下的app里的models
    """
    if app_name:
        return get_model_from_app(app_name)
    all_apps = apps.get_app_configs()
    res = []
    for app in all_apps:
        if app.name.startswith('django'):
            continue
        if app.name in settings.COLUMN_EXCLUDE_APPS:
            continue
        try:
            all_models = get_model_from_app(app.name)
            if all_models:
                for model in all_models:
                    res.append(model)
        except Exception as e:
            pass
    return res

2、字段说明

【1】AutoField

  • int自增列
    • 必须填入参数 primary_key=True。
  • 当model中如果没有自增列,则自动会创建一个列名为id的列。

【2】CharField

字符类型,必须提供max_length参数, max_length表示字符长度。
这里需要知道的是Django中的CharField对应的MySQL数据库中的varchar类型,没有设置对应char类型的字段,但是Django允许我们自定义新的字段,下面我来自定义对应于数据库的char类型

 【3】DateTimeField

  • 日期时间字段
    • 格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
  • 相当于Python中的datetime.datetime()实例。

【4】BigAutoField(AutoField)

  • bigint自增列
    • 必须填入参数 primary_key=True

【5】关系字段 ForeignKey 

  • 外键类型在ORM中用来表示外键关联关系
    • 一般把ForeignKey字段设置在 '一对多'中'多'的一方。
  • ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系

to: 设置要关联的表

to_field: 设置要关联的表的字段

on_delete:当删除关联表中的数据时,当前表与其关联的行的行为

models.CASCADE
级联操作
当主表中被连接的一条数据删除时,从表中所有与之关联的数据同时被删除
2、models.SET_NULL
当主表中的一行数据删除时,从表中所有与之关联的数据的相关字段设置为null
此时注意定义外键时,这个字段必须可以允许为空
3、models.PROTECT
当主表中的一行数据删除时,由于从表中相关字段是受保护的外键,所以都不允许删除
4、models.SET_DEFAULT
当主表中的一行数据删除时,从表中所有相关的数据的关联字段设置为默认值
此时注意定义外键时,这个外键字段应该有一个默认值
5、models.SET()
当主表中的一条数据删除时,从表中所有的关联数据字段设置为SET()中设置的值
与models.SET_DEFAULT相似,只不过此时从表中的相关字段不需要设置default参数
6、models.DO_NOTHING
什么都不做,一切都看数据库级别的约束,注数据库级别的默认约束为RESTRICT,这个约束与django中的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1973591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

私域流量变迁与精细移动化趋势下的AI智能名片小程序源码应用探索

摘要:随着移动互联网技术的飞速发展,私域流量的价值日益凸显,成为企业营销战略的重要组成部分。私域流量的精细化和移动化趋势不仅改变了传统的营销格局,也为新兴技术的应用提供了广阔空间。本文深入探讨了私域流量的变迁历程&…

磁盘碎片整理工具IObit Smart Defrag PRO 绿色版

在数字化时代,电脑的性能直接影响到我们的工作效率和娱乐体验。随着使用时间的增长,硬盘上的文件碎片逐渐增多,导致电脑运行缓慢。今天,我为大家介绍一款强大的磁盘碎片整理工具——IObit Smart Defrag,它能有效解决这…

探索Python的聊天机器人世界:Errbot的魔力

文章目录 探索Python的聊天机器人世界:Errbot的魔力背景:为何选择Errbot?Errbot:Python中的聊天机器人框架安装Errbot:简单几步,即刻开始探索Errbot:五个简单函数的魔法1. 创建机器人2. 响应消息…

全球汽车用MEMS加速度计市场规划预测:未来六年CAGR为2.8%

随着汽车行业的持续发展和消费者对安全性能的需求增加,汽车用MEMS加速度计作为提升车辆安全性和稳定性的关键组件,正逐渐受到市场的广泛关注。本文旨在通过深度分析汽车用MEMS加速度计行业的各个维度,揭示行业发展趋势和潜在机会。 【市场趋…

ElementPlus 中el-select自定义指令实现触底加载请求options数据

1) 背景: 老项目翻新时,发现一个下拉框数据非常多,客户呢,希望全部数据一起展示,意思就是全部数据一起返回给前端用于展示。但这会造成明显的卡顿。~~明显的不合理! QAQ!~~ 于是压力给到前端,查询资料,各种…

论文阅读:Most Probable Densest Subgraphs

摘要 本文提出了一种在不确定图中发现最有可能稠密子图(MPDS)的新方法。不确定图中的每条边都有存在概率,使得计算稠密子图变得複杂。作者定义了稠密子图概率,并证明了计算该概率是#P难的。为了解决这个问题,设计了基…

算法通关:014_1:用栈实现队列

文章目录 题目总结代码运行结果 题目 用栈实现队列 leetcode :232 总结 时间复杂度 平均下来每个方式是O(1) 代码 class MyQueue {public Stack<Integer> in;public Stack<Integer> out;//初始化public MyQueue() {in new Stack<>();out new Stack<…

整体接口测试

文章目录 1.分类1.新增分类1.接口设计2.结果 2.更新分类1.接口设计2.结果 3.查询分类1.接口设计2.结果&#xff08;少了一个count字段暂时不改&#xff09; 4.查询大类下分类1.接口设计2.结果 5.删除分类1.接口设计2.结果 2.标签1.新增标签1.接口设计2.结果 2.更新标签1.接口设…

E5092A可配置的多端口测试仪

E5092A 可配置的多端口测试仪 多达 10 个端口的全交叉测量&#xff0c;或者最多 22 个端口的测量功能。 概述 E5092A 多端口测试仪可以灵活配置&#xff0c;并可与4 端口ENA 网络分析仪&#xff08;E5070B/E5071B/E5071C/E5080A&#xff09;结合使用&#xff0c;组成频率范…

信息安全管理中,文件销毁、硬盘销毁、数据销毁和物料销毁分别如何

文件销毁的方法主要有删除、覆盖、加密和物理破坏。硬盘销毁的方法主要有物理破坏、磁性破坏、化学破坏和高温破坏。数据销毁的方法主要有逻辑删除、物理破坏、磁性破坏和化学破坏。物料销毁的方法主要有回收利用、填埋处理、焚烧处理、生物降解和化学处理。 文件销毁的方法&a…

江协科技51单片机学习- p31 LCD1602液晶屏驱动

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

Frida挂钩Java层代码与协议分析

Hook类中普通方法 在本文中&#xff0c;我们继续以某嘟牛应用为例&#xff0c;在用户点击登录按钮后&#xff0c;哪个方法会被调用。我们在上一篇文章中提到&#xff0c;搜索关键词 “Encrypt” 后&#xff0c;发现两个包含该字符串的 Java 方法。接下来&#xff0c;我们通过 …

AGI思考探究的意义、价值与乐趣Ⅳ

探究in context或Prompt对于LLM来说其根本意义&#xff0c;in context & Prompt Learning带给我们更深一层的提示是什么&#xff1f; 文章里的探索希望能够将in context或Prompt置身于一个更全局的视角来看待&#xff1a;将其视为在真实世界中时空认知流形所映射为数据流形…

路由器IP互联无线对讲系统解决方案

一、项目概况 随着信息化的全面深入发展&#xff0c;各行各业的通信需求日益增长&#xff0c;传统的通信方式无法满足跨网络、跨系统、跨媒介的通信互联互通&#xff0c;打破信息孤岛、提高协同效率&#xff0c;成为当前各行业融合通信的首要任务。尤其大型企业、学校、医院等…

第14课 Scratch少儿编程 入门篇:抓蝴蝶

开车自驾去旅行 故事背景&#xff1a; 春天到了&#xff0c;让我们一起春游&#xff01;公园的草坪上有五颜六色的花朵和翩翩起舞的蝴蝶&#xff0c;让我们拿起工具&#xff0c;去捉蝴蝶吧&#xff01;&#xff01; 程序原理: 添加绿色的草地角色和蝴蝶的角色&#xff0c;给…

【C++程序设计】——利用数组处理批量数据(一)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-削好皮的Pineapple! &#x1f468;‍&#x1f4bb; hello 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 削好皮的Pineapple! 原创 &#x1f468;‍&#x1f4…

使用 Python 制作一个属于自己的 AI 搜索引擎

1. 使用到技术 OpenAI KEYSerper KEYBing Search 2. 原理解析 使用Google和Bing的搜搜结果交由OpenAI处理并给出回答。 3. 代码实现 import requests from lxml import etree import os from openai import OpenAI# 从环境变量中加载 API 密钥 os.environ["OPENAI_AP…

5G三大场景:eMBB、mMTC、uRLLC

1G,2G,3G,4G,5G有什么区别&#xff1f;5G的优势在哪&#xff1f;有什么应用&#xff1f; 1G,2G,3G,4G,5G有什么区别&#xff1f;5G的优势在哪&#xff1f;有什么应用&#xff1f;_3g4g5g的区别和作用-CSDN博客 从1G到4G&#xff0c;移动通信的核心是人与人之间的通信&#xff0…

Spring Cache框架(AOP思想)+ Redis实现数据缓存

文章目录 1 简介1.1 基本介绍1.2 为什么要用 Spring Cache&#xff1f; 2 使用方法2.1 依赖导入&#xff08;Maven&#xff09;2.2 常用注解2.3 使用步骤2.4 常用注解说明1&#xff09;EnableCaching2&#xff09;CachePut3&#xff09;Cacheable4&#xff09;CacheEvict 3 注意…

【云服务器】vscode + onethingAi + SSH远程连接

通过VS code远程连接服务器&#xff0c;并进行上传和下载文件操作_vs code 上传制定文件-CSDN博客 vscode远程连接服务器&#xff08;remote ssh&#xff09;上传本地文件到服务器(sftp)_vscode上传文件到服务器-CSDN博客 vscode连接远程服务器&#xff08;傻瓜式教学&#x…