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
相关产品推荐
相关产品推荐

