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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 05:48:23