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