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

一、说明

上一篇文章建立一个最简单的项目,现在我们建立一个公共模型,抽取公共字段,以便于后续模块继承,过程之中会对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中的

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用 DjangoDjango REST framework 和 Swagger 的后端框架 demo。 首先,需要安装 DjangoDjango REST framework 和 Swagger: ``` pip install Django pip install djangorestframework pip install django-rest-swagger ``` 接着,创建一个 Django 项目: ``` django-admin startproject demo ``` 然后,在项目根目录下创建一个名为 `api` 的 Django app: ``` cd demo python manage.py startapp api ``` 接下来,修改 `demo/settings.py` 文件,将 `api` app 添加到 `INSTALLED_APPS` 列表中: ```python INSTALLED_APPS = [ # ... 'rest_framework', 'rest_framework_swagger', 'api', ] ``` 然后,在 `api` app 下创建一个名为 `views.py` 的文件,用于编写 API 视图函数: ```python from rest_framework.decorators import api_view from rest_framework.response import Response @api_view(['GET']) def hello(request): """ 返回一个简单的字符串 """ return Response("Hello, world!") ``` 接着,在 `api` app 下创建一个名为 `urls.py` 的文件,用于配置 API 路由: ```python from django.urls import path from rest_framework_swagger.views import get_swagger_view from . import views schema_view = get_swagger_view(title='API文档') urlpatterns = [ path('', schema_view), path('hello/', views.hello), ] ``` 最后,修改 `demo/settings.py` 文件,设置 REST framework 和 Swagger 的配置: ```python REST_FRAMEWORK = { 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema' } SWAGGER_SETTINGS = { 'SECURITY_DEFINITIONS': { 'Basic': { 'type': 'basic' } }, } ``` 现在,运行 Django 项目: ``` python manage.py runserver ``` 在浏览器中访问 `http://127.0.0.1:8000/api/`,即可看到 Swagger 的 API 文档界面。在其中可以看到一个名为 `hello` 的 API,点击该 API 可以进行测试,测试结果将会返回一个字符串 "Hello, world!"。 这就是使用 DjangoDjango REST framework 和 Swagger 编写的一个后端框架 demo。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值