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

一、说明

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

二、创建一个db.py

目录如下图

1、代码 

from importlib import import_modulefrom django.apps import apps
from django.db import models
from smartwater import settings
from django.conf import settingstable_prefix = settings.TABLE_PREFIXclass 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 = Trueverbose_name = '核心模型'verbose_name_plural = verbose_namedef 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':continuefields = [{'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_listdef 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'):continueif app.name in settings.COLUMN_EXCLUDE_APPS:continuetry:all_models = get_model_from_app(app.name)if all_models:for model in all_models:res.append(model)except Exception as e:passreturn 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.rhkb.cn/news/394131.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于QT实现的简易WPS(已开源)

一、开发工具及开源地址: 开发工具:QTCreator ,QT 5 开源地址: GitHub - Whale-xh/WPS_official: Simple WPS based on QTSimple WPS based on QT. Contribute to Whale-xh/WPS_official development by creating an acc…

推荐 3个实用且完全免费的在线工具,每天都会用到,无需登录打开即用

100font 100font是一个专业的免费商用字体下载网站,专注于收集、整理和分享各种免费无版权的商用字体。用户可以在这个平台上找到并下载简体中文、繁体中文、英文、日文、韩文等多种语言类型的字体。 该网站的特点包括清晰的分类和直观的下载流程,用户可…

进阶SpringBoot之 Spring 官网或 IDEA 快速构建项目

SpringBoot 就是一个 JavaWeb 的开发框架,约定大于配置 程序 数据结构 算法 微服务架构是把每个功能元素独立出来,再动态组合,是对功能元素的复制 这样做可以节省调用资源,每个功能元素的服务都是一个可替代、可独立升级的软…

算法混合杂项

基础类型 可用template 投影 是有方向的 求俩直线交点 推公式 q我们不知道,已知p1 p2,正弦定理,α可以用叉积表示出来 β同理 所以我们能求出p1q 已知piq 回归到我们上一个问题,已知方向和长度,我们就能够求出Voq …

C语言 ——— 学习并使用字符分类函数

目录 学习isupper函数 学习isdigit函数 学习tolower函数 将输入的字符串中把大写字母转换为小写字母并输出 学习isupper函数 参数部分: 形参需要传递的是一个字母,字符在ASCII码表上是以整型存储的,所以实参部分用(int c)没有问题 返回…

【iOS】AutoreleasePool自动释放池的实现原理

目录 ARC与MRC项目中的main函数自动释放池autoreleasepool {}实现原理AutoreleasePoolPage总结 objc_autoreleasePoolPush的源码分析autoreleaseNewPageautoreleaseFullPageautoreleaseNoPage autoreleaseFast总结 autorelease方法源码分析objc_autoreleasePoolPop的源码分析po…

谁来做引领企业精益变革的舵手最合适?

在这个瞬息万变的商业时代,企业如同航行在波涛汹涌的大海中的巨轮,既需面对未知的挑战,也要抓住稍纵即逝的机遇。而在这场没有终点的航行中,引领企业实现精益变革的舵手,无疑是推动企业破浪前行、稳健致远的关键角色。…

FFmpeg Windows安装教程

一. 下载ffmpeg 进入Download FFmpeg网址,点击下载windows版ffmpeg。 下载第一个essentials版本就行。 二. 环境配置 上面源码解压后如下 将bin添加到系统环境变量 验证安装是否成功,输入ffmpeg –version,显示版本即为安装成功。

Python学习(1):使用Python的Dask库实现并行计算

目录 一、Dask介绍 二、使用说明 安装 三、测试 1、单个文件中实现功能 2、运行多个可执行文件 最近在写并行计算相关部分,用到了python的Dask库。 Dask官网:Dask | Scale the Python tools you love 一、Dask介绍 Dask是一个灵活的并行和分布式…

网工内推 | 国企运维工程师,华为认证优先,最高年薪20w

01 上海陆家嘴物业管理有限公司 🔷招聘岗位:IT运维工程师 🔷岗位职责: 1、负责对公司软、硬件系统、周边设备、桌面系统、服务器、网络基础环境运行维护、故障排除。 2、负责对各部门软件操作、网络安全进行检查、指导。 3、负责…

Mysql——update更新数据的方式

注:文章参考: MySQL 更新数据 不同条件(批量)更新不同值_update批量更新同一列不同值-CSDN博客文章浏览阅读2w次,点赞20次,收藏70次。一般在更新时会遇到以下场景:1.全部更新;2.根据条件更新字段中的某部分…

vivado OPT_SKIPPED

当跳过候选基元单元的逻辑优化时,OPT_skipped属性 更新单元格以反映跳过的优化。当跳过多个优化时 在同一单元格上,OPT_SKIPPED值包含跳过的优化列表。 架构支持 所有架构。 适用对象 OPT_SKIPPED属性放置在单元格上。 价值观 下表列出了各种OPT_design选…

【CSDN平台BUG】markdown图片链接格式被手机端编辑器自动破坏(8.6 已修复)

文章目录 bug以及解决方法bug原理锐评后续 bug以及解决方法 现在是2024年8月,我打开csdn手机编辑器打算修改一下2023年12月的一篇文章,结果一进入编辑器,源码就变成了下面这个样子,我起初不以为意,就点击了发布&#…

Revit二次开发选择过滤器,SelectionFilter

过滤器分为选择过滤器与规则过滤器 规则过滤器可以看我之前写的这一篇文章: Revit二次开发在项目中给链接模型附加过滤器 选择过滤器顾名思义就是可以将选择的构件ID集合传入并加入到视图过滤器中,有一些场景需要对某些构件进行过滤选择,但是没有共同的逻辑规则进行筛选的情况…

Golang | Leetcode Golang题解之第313题超级丑数

题目&#xff1a; 题解&#xff1a; func nthSuperUglyNumber(n int, primes []int) int {dp : make([]int, n1)m : len(primes)pointers : make([]int, m)nums : make([]int, m)for i : range nums {nums[i] 1}for i : 1; i < n; i {minNum : math.MaxInt64for j : range…

力扣面试150 基本计算器 双栈模拟

Problem: 224. 基本计算器 &#x1f468;‍&#x1f3eb; 参考题解 Code class Solution {public int calculate(String s) {// 存放所有的数字&#xff0c;用于计算LinkedList<Integer> nums new LinkedList<>();// 为了防止第一个数为负数&#xff0c;先往 nu…

开源免费的wiki知识库

开源的Wiki知识库有多种选择&#xff0c;它们各自具有不同的特点和优势&#xff0c;适用于不同的场景和需求。以下是一些主流的开源Wiki知识库系统&#xff1a; MediaWiki 简介&#xff1a;MediaWiki是使用PHP编写的免费开源Wiki软件包&#xff0c;是Wikipedia和其他Wikimedia…

鸿蒙(API 12 Beta2版)媒体开发【使用AudioCapturer开发音频录制功能】

如何选择音频录制开发方式 系统提供了多样化的API&#xff0c;来帮助开发者完成音频录制的开发&#xff0c;不同的API适用于不同录音输出格式、音频使用场景或不同开发语言。因此&#xff0c;选择合适的音频录制API&#xff0c;有助于降低开发工作量&#xff0c;实现更佳的音频…

Mybatis学习(3)

目录 一、JDBC vs Mybatis 二、Mybatis Plugin 三、Dao接口和xml文件的sql如何建立关联 四、Mybatis如何将sql执行结果封装为目标对象并返回的&#xff1f;都有哪些映射形式&#xff1f; 五、动态SQL 六、一级缓存和二级缓存 七、接口绑定的实现 八、Mybatis vs Hiberna…

【C++高阶】:自定义删除器的全面探索

✨ 我凌于山壑万里&#xff0c;一生自由随风起 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&am…