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

保存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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:45:27