Django序列化器传参初始化ChoiceField后触发AttributeError问题排查
问题原因及修复方案
核心问题
错误根源在CatSerializer的__init__方法里调用父类构造函数的代码:
super().__init__(self, *args, **kwargs)
这里多传了一个self参数。DRF的Serializer构造函数第一个参数是要序列化的数据/实例,你错误地把序列化器自己传了进去。当调用serializer.data时,DRF会试图从序列化器实例本身读取name字段,而不是你传入的POST请求数据,自然找不到这个属性,所以抛出AttributeError。
修复方法
把CatSerializer的__init__方法里的父类调用改成正确形式,去掉多余的self:
class CatSerializer(serializers.Serializer): name = serializers.ChoiceField(choices=[]) def __init__(self, *args, **kwargs): self.names = kwargs.pop("names") self.fields["name"].choices = self.names # 正确调用父类构造函数,无需传入self super().__init__(*args, **kwargs)
额外优化点
- 视图里不用手动解析
request.body,DRF已经把解析好的请求数据放在request.data里,直接用就行:
def post(self, request): serializer = self.get_serializer(data=request.data) if serializer.is_valid(): return Response({"message": "success", "serialized-data": serializer.data}) else: return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
内容的提问来源于stack exchange,提问作者Amin Ba
相关产品推荐
相关产品推荐

