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

ModelViewSet中PUT请求无需传name和name_abbrev的实现方法咨询

Django ModelViewSet PUT请求跳过非空必填字段的实现方法

方案1:针对更新场景修改序列化器字段规则

在对应的ModelSerializer中,判断当前是更新操作(存在instance)时,将name和name_abbrev的required属性设为False,既保证创建时的必填校验,又允许更新时不传这两个字段:

from rest_framework import serializers
from your_app.models import TargetModel

class TargetModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = TargetModel
        fields = ['id', 'name', 'name_abbrev', 'other_field']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 更新操作时放开必填限制
        if self.instance:
            self.fields['name'].required = False
            self.fields['name_abbrev'].required = False

方案2:改用PATCH请求实现部分更新

REST规范中,PUT是全量更新,要求传入所有必填字段;而PATCH是部分更新,仅需传递需要修改的字段。ModelViewSet默认集成了PartialUpdateMixin,直接发送PATCH请求即可,无需额外代码配置,就能实现不传name和name_abbrev更新其他字段的需求。

方案3:重写序列化器的update方法补全字段值

如果坚持使用PUT请求,可以在序列化器的update方法中,用数据库现有值补全未传入的字段,避免必填校验失败:

def update(self, instance, validated_data):
    # 若payload未传字段,用实例原有值填充
    validated_data.setdefault('name', instance.name)
    validated_data.setdefault('name_abbrev', instance.name_abbrev)
    return super().update(instance, validated_data)

内容的提问来源于stack exchange,提问作者Venkatesan Sundaram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:30:00