You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:10:24