重写AuditUserFieldsMixin

This commit is contained in:
xie7654
2025-06-30 22:26:00 +08:00
parent c7f7bf9258
commit 05554eb821
6 changed files with 30 additions and 29 deletions

View File

@@ -6,6 +6,7 @@ from rest_framework.response import Response
from system.models import Menu, MenuMeta
from utils.custom_model_viewSet import CustomModelViewSet
from utils.serializers import CustomModelSerializer
class MenuMetaSerializer(serializers.ModelSerializer):
@@ -14,7 +15,7 @@ class MenuMetaSerializer(serializers.ModelSerializer):
model = MenuMeta
fields = '__all__'
class MenuSerializer(serializers.ModelSerializer):
class MenuSerializer(CustomModelSerializer):
"""菜单序列化器"""
parent = serializers.CharField(source='pid.name', read_only=True)
meta = MenuMetaSerializer()
@@ -46,11 +47,13 @@ class MenuSerializer(serializers.ModelSerializer):
"""创建菜单及关联的元数据"""
meta_data = validated_data.pop('meta')
meta = MenuMeta.objects.create(**meta_data)
self.set_audit_user_fields(validated_data, is_create=True)
menu = Menu.objects.create(meta=meta, **validated_data)
return menu
def update(self, instance, validated_data):
"""更新菜单及关联的元数据"""
self.set_audit_user_fields(validated_data, is_create=False)
meta_data = validated_data.pop('meta', {})
meta_serializer = self.fields['meta']
meta_serializer.update(instance.meta, meta_data)

View File

@@ -7,9 +7,10 @@ from rest_framework.response import Response
from system.models import RolePermission, Menu, Role
from utils.custom_model_viewSet import CustomModelViewSet
from utils.serializers import CustomModelSerializer
class RoleSerializer(serializers.ModelSerializer):
class RoleSerializer(CustomModelSerializer):
"""角色序列化器"""
permissions = serializers.PrimaryKeyRelatedField(
queryset=Menu.objects.all(),
@@ -34,7 +35,7 @@ class RoleViewSet(CustomModelViewSet):
queryset = Role.objects.all()
serializer_class = RoleSerializer
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
filterset_fields = ['status']
filterset_fields = ['status', 'name']
search_fields = ['name']
ordering_fields = ['create_time']

View File

@@ -9,15 +9,29 @@ from django.utils.functional import cached_property
from rest_framework.utils.serializer_helpers import BindingDict
class CustomModelSerializer(ModelSerializer):
class AuditUserFieldsMixin:
"""
增强DRF的ModelSerializer,可自动更新模型的审计字段记录
(1)self.request能获取到rest_framework.request.Request对象
用于自动赋值 creator 和 modifier 字段的 Mixin
"""
# 修改人的审计字段名称, 默认modifier, 继承使用时可自定义覆盖
modifier_field_id = 'modifier'
# 创建人的审计字段名称, 默认creator, 继承使用时可自定义覆盖
creator_field_id = 'creator'
def set_audit_user_fields(self, validated_data, is_create=True):
username = self.get_request_username() if hasattr(self, 'get_request_username') else None
if getattr(self, 'request', None):
if self.modifier_field_id in self.fields:
validated_data[self.modifier_field_id] = username
if is_create and self.creator_field_id in self.fields:
validated_data[self.creator_field_id] = username
class CustomModelSerializer(AuditUserFieldsMixin, ModelSerializer):
"""
增强DRF的ModelSerializer,可自动更新模型的审计字段记录
(1)self.request能获取到rest_framework.request.Request对象
"""
# 添加默认时间返回格式
create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False)
@@ -30,17 +44,11 @@ class CustomModelSerializer(ModelSerializer):
return super().save(**kwargs)
def create(self, validated_data):
if self.request:
if self.modifier_field_id in self.fields:
validated_data[self.modifier_field_id] = self.get_request_username()
if self.creator_field_id in self.fields:
validated_data[self.creator_field_id] = self.get_request_username()
self.set_audit_user_fields(validated_data, is_create=True)
return super().create(validated_data)
def update(self, instance, validated_data):
if self.request:
if hasattr(self.instance, self.modifier_field_id):
validated_data[self.modifier_field_id] = self.get_request_username()
self.set_audit_user_fields(validated_data, is_create=False)
return super().update(instance, validated_data)
def get_request_username(self):