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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:00:54