From 275d380fe0cc4c5521d60f14aa34cb385d064c96 Mon Sep 17 00:00:00 2001 From: acjzdpbb <103135538+acjzdpbb@users.noreply.github.com> Date: Sun, 23 Jun 2024 10:07:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9C=A8=E6=A0=B8=E5=BF=83=E6=A0=87?= =?UTF-8?q?=E5=87=86=E6=8A=BD=E8=B1=A1=E6=A8=A1=E5=9E=8B=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E4=B8=AD=E8=AE=BE=E7=BD=AE=E6=8F=92=E5=85=A5=E5=92=8C=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=A8=A1=E5=9E=8B=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/dvadmin/utils/models.py | 136 ++++++++++++++++++++++++++------ 1 file changed, 113 insertions(+), 23 deletions(-) diff --git a/backend/dvadmin/utils/models.py b/backend/dvadmin/utils/models.py index fb0c2ba70a..7ed2f92848 100644 --- a/backend/dvadmin/utils/models.py +++ b/backend/dvadmin/utils/models.py @@ -6,13 +6,14 @@ @Created on: 2021/5/31 031 22:08 @Remark: 公共基础model类 """ +from datetime import datetime from importlib import import_module +from application import settings from django.apps import apps -from django.db import models from django.conf import settings - -from application import settings +from django.db import models +from rest_framework.request import Request table_prefix = settings.TABLE_PREFIX # 数据库表名前缀 @@ -87,6 +88,111 @@ class CoreModel(models.Model): verbose_name = '核心模型' verbose_name_plural = verbose_name + def get_request_user(self, request: Request): + if getattr(request, "user", None): + return request.user + return None + + def get_request_user_id(self, request: Request): + if getattr(request, "user", None): + return getattr(request.user, "id", None) + return None + + def get_request_user_name(self, request: Request): + if getattr(request, "user", None): + return getattr(request.user, "name", None) + return None + + def get_request_user_username(self, request: Request): + if getattr(request, "user", None): + return getattr(request.user, "username", None) + return None + + def common_insert_data(self, request: Request): + data = { + 'create_datetime': datetime.now(), + 'creator': self.get_request_user(request) + } + return {**data, **self.common_update_data(request)} + + def common_update_data(self, request: Request): + return { + 'update_datetime': datetime.now(), + 'modifier': self.get_request_user_username(request) + } + + exclude_fields = [ + '_state', + 'pk', + 'id', + 'create_datetime', + 'update_datetime', + 'creator', + 'creator_id', + 'creator_pk', + 'creator_name', + 'modifier', + 'modifier_id', + 'modifier_pk', + 'modifier_name', + 'dept_belong_id', + ] + + def get_exclude_fields(self): + return self.exclude_fields + + def get_all_fields(self): + return self._meta.fields + + def get_all_fields_names(self): + return [field.name for field in self.get_all_fields()] + + def get_need_fields_names(self): + return [field.name for field in self.get_all_fields() if field.name not in self.exclude_fields] + + def to_data(self): + """将模型转化为字典(去除不包含字段)(注意与to_dict_data区分)。 + """ + res = {} + for field in self.get_need_fields_names(): + field_value = getattr(self, field) + res[field] = field_value.id if (issubclass(field_value.__class__, CoreModel)) else field_value + return res + + @property + def DATA(self): + return self.to_data() + + def to_dict_data(self): + """需要导出的字段(去除不包含字段)(注意与to_data区分) + """ + return {field: getattr(self, field) for field in self.get_need_fields_names()} + + @property + def DICT_DATA(self): + return self.to_dict_data() + + def insert(self, request): + """插入模型 + """ + assert self.pk is None, f'模型{self.__class__.__name__}还没有保存到数据中,不能手动指定ID' + validated_data = {**self.common_insert_data(request), **self.DICT_DATA} + return self.__class__._default_manager.create(**validated_data) + + def update(self, request, update_data: dict[str, any] = None): + """更新模型 + """ + assert isinstance(update_data, dict), 'update_data必须为字典' + validated_data = {**self.common_insert_data(request), **update_data} + for key, value in validated_data.items(): + # 不允许修改id,pk,uuid字段 + if key in ['id', 'pk', 'uuid']: + continue + if hasattr(self, key): + setattr(self, key, value) + self.save() + return self + def get_all_models_objects(model_name=None): """ @@ -97,16 +203,9 @@ def get_all_models_objects(model_name=None): 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": [] - } + table = {"tableName": item._meta.verbose_name, "table": item.__name__, "tableFields": []} for field in item._meta.fields: - fields = { - "title": field.verbose_name, - "field": field.name - } + 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: @@ -125,17 +224,8 @@ def get_model_from_app(app_name): 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 - }) + 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 -- Gitee