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

Django Rest Framework调用put/create时出现AssertionError问题咨询

错误原因

你当前的报错是因为为department字段设置了带点的嵌套源department.name,DRF默认不支持可写的嵌套源字段,所以要求你要么设置该字段为只读,要么自定义create/update方法。

无需自定义序列化方法的解决办法

有两种常用方案可满足「展示department的name值、正常调用创建/更新接口」的需求,你可以根据前后端交互约定选择:

方案1:读写均使用department的name值

如果允许前端提交数据时传department的name值,直接将原来的PrimaryKeyRelatedField替换为SlugRelatedField即可,这个字段天生支持指定关联对象的展示和匹配字段:

# serializers.py 修改后的TeacherSerializer
class TeacherSerializer(serializers.HyperlinkedModelSerializer):
    department = serializers.SlugRelatedField(
        slug_field='name', # 指定用Department的name字段做展示和匹配
        queryset=Department.objects.all() # 用于根据name查询对应的Department对象
    )

    class Meta:
        model = Teacher
        fields = ['url', 'name', 'department', 'tenure']

该方案下,接口返回的department值为部门name,创建/更新时传对应部门的name值即可完成关联。
注意使用该方案时需要保证Department的name字段是唯一值,避免匹配到多个部门报错。

方案2:读返回name、写提交主键ID

如果希望前端提交数据时还是传department的主键ID,可将展示字段和写入字段拆分:

# serializers.py 修改后的TeacherSerializer
class TeacherSerializer(serializers.HyperlinkedModelSerializer):
    # 只读字段,返回部门name
    department = serializers.StringRelatedField(read_only=True)
    # 只写字段,接收部门主键ID,关联到Teacher的department外键
    department_id = serializers.PrimaryKeyRelatedField(
        queryset=Department.objects.all(),
        write_only=True,
        source='department'
    )

    class Meta:
        model = Teacher
        fields = ['url', 'name', 'department', 'department_id', 'tenure']

该方案下,接口返回的字段包含department(值为部门name),创建/更新时传department_id字段值为对应部门的主键ID即可。

内容的提问来源于stack exchange,提问作者KSWebDev1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:57:03