DRF ModelSerializer验证后validated_data缺失id字段原因咨询
DRF ModelSerializer验证后validated_data缺失'id'字段的原因分析
问题场景
使用Django Rest Framework的ModelSerializer验证请求中的id字段时,明明serializer.is_valid()返回True,但serializer.validated_data里却找不到id字段。切换为普通Serializer后,该字段能正常出现在validated_data中。
核心原因
DRF的ModelSerializer会自动将模型的主键字段(默认的id属于AutoField)标记为只读字段。
Django默认的id是AutoField类型,这种字段由数据库自动生成,DRF默认认为在反序列化(处理请求数据)的场景下,主键字段不需要由客户端传入,因此会给对应的序列化器字段设置read_only=True。
只读字段的特性是:仅在序列化(将模型实例转为响应数据)时生效,反序列化验证请求数据时,会跳过将该字段纳入validated_data,哪怕你在fields列表里明确指定了它。
而普通Serializer中手动定义的IntegerField默认是读写属性,验证通过后自然会保留在validated_data里。
验证方式
可以打印ModelSerializer的字段属性来确认:
serializer = WatchlistIdSerializer() print(serializer.fields['id'].read_only) # 输出结果为True
补充解决方法
除了切换为普通Serializer,还可以通过以下方式修改ModelSerializer的配置:
方式1:显式覆盖id字段
class WatchlistIdSerializer(serializers.ModelSerializer): id = serializers.IntegerField(read_only=False) class Meta: model = Watchlist fields = ['id']
方式2:使用extra_kwargs修改字段属性
class WatchlistIdSerializer(serializers.ModelSerializer): class Meta: model = Watchlist fields = ['id'] extra_kwargs = {'id': {'read_only': False}}
内容的提问来源于stack exchange,提问作者1peer23
相关产品推荐
相关产品推荐

