Django REST Framework中DictField报AttributeError问题求助
问题解决:DRF DictField 序列化报错 AttributeError
错误原因
- 属性名不匹配:你的
Geeks类初始化时将传入的字典赋值给了self.dict,但序列化器GeeksSerializer里定义的字段是dictionary,DRF会自动尝试从实例中读取与字段名同名的属性,找不到就抛出AttributeError。 - 错误的
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
相关产品推荐
相关产品推荐

