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
相关产品推荐
相关产品推荐

