如何将Django REST Framework中Serializer的update移至View的perform_update?
迁移日志逻辑到perform_update的实现步骤
1. 清理Serializer中的日志代码
打开serializer.py,修改ClearanceItemSerialize类的update方法,移除原有的日志保存逻辑,只保留实例更新的核心逻辑:
# serializer.py from rest_framework import serializers from .models import ClearanceItem class ClearanceItemSerialize(serializers.ModelSerializer): class Meta: model = ClearanceItem fields = '__all__' # 替换为你实际需要的字段列表 def update(self, instance, validated_data): # 仅保留基础更新逻辑,移除日志相关代码 instance = super().update(instance, validated_data) instance.save() return instance
2. 在View的perform_update中添加日志逻辑
打开views.py,修改APIClerkUpdate类,重写perform_update方法,先完成实例更新,再写入操作日志:
# views.py from rest_framework.viewsets import GenericViewSet from rest_framework.mixins import UpdateModelMixin from .models import ClearanceItem, TransactionLog from .serializers import ClearanceItemSerialize class APIClerkUpdate(GenericViewSet, UpdateModelMixin): queryset = ClearanceItem.objects.all() serializer_class = ClearanceItemSerialize def perform_update(self, serializer): # 执行父类更新逻辑,获取更新后的实例 updated_instance = serializer.save() # 写入操作日志到transaction_log # 请根据你的TransactionLog模型字段调整以下参数 TransactionLog.objects.create( operator=self.request.user, # 当前操作的登录用户 operation_type="UPDATE", target_id=updated_instance.id, target_model="ClearanceItem", operation_detail=f"更新清关项:{updated_instance.name}" # 自定义日志内容 # 补充其他必填字段 )
可选优化:记录字段变更差异
如果需要日志中体现具体更新的字段差异,可以在perform_update中对比更新前后的字段值:
def perform_update(self, serializer): # 获取更新前的实例字段值 old_instance = self.get_object() old_data = serializers.serialize('python', [old_instance])[0]['fields'] # 执行更新 updated_instance = serializer.save() # 对比新旧数据,生成差异描述 changed_fields = [] for field, new_val in serializer.validated_data.items(): if old_data[field] != new_val: changed_fields.append(f"{field}: {old_data[field]} → {new_val}") # 写入带差异的日志 TransactionLog.objects.create( operator=self.request.user, operation_type="UPDATE", target_id=updated_instance.id, target_model="ClearanceItem", operation_detail="; ".join(changed_fields) )
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

