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

如何优雅地实现DRF框架下的PATCH局部更新接口

DRF PATCH接口规范实现方案

1. 序列化器调整

你当前使用fields = "__all__"会暴露所有字段,包括不需要更新的关联字段,这是关联字段报错的核心原因,首先调整序列化器:

  • 明确指定允许更新的字段,或者将关联字段设置为read_only避免更新时触发校验
  • 重写update方法处理location字段的追加逻辑(你的业务是追加而非替换,默认序列化器更新逻辑不满足需求)
class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        # 方案1:只指定需要更新的字段
        fields = ["username", "dp", "location"]
        # 方案2:如果要保留全字段返回,就保留__all__,把不需要更新的关联字段设为只读
        # fields = "__all__"
        # read_only_fields = ["user", ...其他不需要更新的关联字段...]

    def update(self, instance, validated_data):
        # 单独处理location字段的追加逻辑
        if "location" in validated_data:
            instance.location.append(validated_data.pop("location"))
        # 其余字段走默认更新逻辑
        return super().update(instance, validated_data)

2. ViewSet逻辑实现

DRF的ModelViewSet本身自带partial_update方法对应PATCH请求,不需要手动手写字段判断逻辑,也自带异常处理、参数校验能力。

如果使用ModelViewSet,仅需要基础配置即可:

from rest_framework import viewsets
from django.shortcuts import get_object_or_404

class ProfileViewSet(viewsets.ModelViewSet):
    queryset = Profile.objects.all()
    serializer_class = ProfileSerializer
    # 按需配置允许的请求方法
    http_method_names = ["patch"]

    # 你的查询逻辑是根据user的id查询Profile,重写get_object方法即可
    def get_object(self):
        user_id = self.kwargs["id"]
        return get_object_or_404(Profile, user__id=user_id)

如果是自定义APIView的写法,规范的patch方法实现如下:

def patch(self, request, id: int, format=None) -> Response:
    # 查询实例,不存在直接返回标准404错误
    profile = get_object_or_404(Profile, user__id=id)
    # 传入partial=True开启局部更新校验,仅校验请求中传入的字段
    serializer = ProfileSerializer(profile, data=request.data, partial=True)
    # 统一做参数校验,不合法直接返回400错误
    serializer.is_valid(raise_exception=True)
    # 执行更新
    serializer.save()
    # 返回更新后的数据
    return Response(serializer.data)

核心优化点

  • 去掉手动判断字段的硬编码逻辑,后续新增可更新字段仅需修改序列化器的fields配置即可
  • 新增参数校验逻辑,避免非法数据入库
  • 统一处理实例不存在的场景,返回标准404错误而非服务端500错误
  • 关联字段设为只读之后,更新时不会校验关联字段的合法性,解决关联字段报错问题

内容的提问来源于stack exchange,提问作者Maifee Ul Asad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:27:01