保存ContactSerializer时触发AttributeError:对象无get_status属性
解决ContactSerializer保存时的AttributeError问题
错误原因
你在ContactSerializer中给status字段使用了serializers.SerializerMethodField(read_only=True),但Django REST Framework要求这类字段必须配套实现get_status(self, obj)方法来返回字段值——你没有定义这个方法,所以在POST保存后序列化返回数据时触发了'ContactSerializer' object has no attribute 'get_status'错误。
另外,你的Contact模型中status字段已经设置了默认值'New',完全不需要用SerializerMethodField,直接让序列化器映射模型字段即可。
修复方案
方案一:移除SerializerMethodField,通过extra_kwargs设置只读
修改ContactSerializer,删掉status = serializers.SerializerMethodField(read_only=True)这一行,在Meta类中用extra_kwargs标记status为只读:
class ContactSerializer(serializers.ModelSerializer): name = serializers.CharField( style={ "template": TEMPLATE_PATH, "class": "custom_form_control", "input_type": "input" } ) email = serializers.CharField( style={ "template": TEMPLATE_PATH, "class": "custom_form_control", "input_type": "input" } ) subject = serializers.CharField( style={ "template": TEMPLATE_PATH, "class": "custom_form_control", "input_type": "select", "choice": Contact.SUBJECT } ) message = serializers.CharField( style={ "template": TEMPLATE_PATH, "input_type": "textarea", } ) class Meta: model = Contact fields = "__all__" extra_kwargs = { 'status': {'read_only': True} }
方案二:显式定义status字段(不用SerializerMethodField)
如果你更倾向于显式声明字段,也可以把SerializerMethodField替换为普通的CharField并标记只读:
class ContactSerializer(serializers.ModelSerializer): # 替换原来的SerializerMethodField status = serializers.CharField(read_only=True) name = serializers.CharField( style={ "template": TEMPLATE_PATH, "class": "custom_form_control", "input_type": "input" } ) # 其余字段定义不变... class Meta: model = Contact fields = "__all__"
为什么GET请求正常?
GET请求中你实例化的是空序列化器(ContactSerializer()),不需要序列化具体的模型对象,因此不会触发get_status方法的调用;而POST请求保存成功后,要序列化刚创建的Contact对象返回数据,这时候就会尝试调用get_status,从而触发错误。
内容的提问来源于stack exchange,提问作者rafaelHTML
相关产品推荐
相关产品推荐

