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

Django REST Framework中DictField报AttributeError问题求助

问题解决:DRF DictField 序列化报错 AttributeError

错误原因

  1. 属性名不匹配:你的Geeks类初始化时将传入的字典赋值给了self.dict,但序列化器GeeksSerializer里定义的字段是dictionary,DRF会自动尝试从实例中读取与字段名同名的属性,找不到就抛出AttributeError。
  2. 错误的child字段写法:单独定义child = serializers.CharField()是错误的,DictField的子字段类型应该通过字段自身的child参数配置,而非新增独立字段。

修正方案

方案一:修改类属性名匹配序列化器字段

修改app1/serializers.py:

from rest_framework import serializers

class Geeks(object):
    def __init__(self, dictionary):
        self.dictionary = dictionary  # 将属性名改为dictionary,与序列化器字段名一致

class GeeksSerializer(serializers.Serializer):
    # 通过child参数指定DictField的子字段类型
    dictionary = serializers.DictField(child=serializers.CharField())

方案二:用source参数映射属性(不改动原类)

如果不想修改Geeks类的属性名,可通过source参数指定字段对应的实例属性:

from rest_framework import serializers

class Geeks(object):
    def __init__(self, dictionary):
        self.dict = dictionary

class GeeksSerializer(serializers.Serializer):
    # source='dict' 指定读取实例的dict属性,映射到dictionary字段
    dictionary = serializers.DictField(source='dict', child=serializers.CharField())

测试验证

在python manage.py shell中执行:

>>> demo = {}
>>> demo['name'] = "Naveen"
>>> demo['age'] = "21"  # 子字段为CharField,需确保值为字符串(若支持数字可将child改为IntegerField)
>>> obj = Geeks(demo)
>>> serializer = GeeksSerializer(obj)
>>> serializer.data
{'dictionary': {'name': 'Naveen', 'age': '21'}}  # 正常输出序列化结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:05:32