DRF序列化器创建ManyToMany字段报错问题排查求助
问题根因
报错的核心原因是序列化器中同时配置了depth=1和显式定义了categories的PrimaryKeyRelatedField,两者在处理多对多字段的反序列化逻辑时产生了冲突。depth是DRF提供的用于简化查询时嵌套序列化输出的参数,仅对正向序列化(返回数据给前端)生效,但是配置后会覆盖你显式声明的关联字段的反序列化规则,导致多对多字段的提交逻辑失效。
修复方案
- 直接移除序列化器
Meta中的depth=1配置即可解决创建报错的问题,修改后的序列化器如下:
class CreatorRawArtworkSerializer(serializers.ModelSerializer): categories = serializers.PrimaryKeyRelatedField(queryset=DesignerCategories.objects.all(), many=True) class Meta: model = CreatorRawArtwork fields = "__all__"
- 如果你需要在查询时返回分类的详细信息,不要使用
depth参数,单独配置只读的嵌套序列化器即可,参考写法:
# 先定义分类的序列化器 class DesignerCategoriesSerializer(serializers.ModelSerializer): class Meta: model = DesignerCategories # 这里按需填写要返回的分类字段 fields = ["id", "name"] class CreatorRawArtworkSerializer(serializers.ModelSerializer): # 写字段,用于接收提交的分类主键 categories = serializers.PrimaryKeyRelatedField(queryset=DesignerCategories.objects.all(), many=True, write_only=True) # 读字段,用于返回分类详情 categories_detail = DesignerCategoriesSerializer(source="categories", many=True, read_only=True) class Meta: model = CreatorRawArtwork # 手动列出所有字段,把新增的categories_detail加进去 fields = ["id", "title", "descripton", "editions", "price", "created_at", "medias", "user", "collection", "categories", "categories_detail"]
额外校验点
提交请求时,categories参数必须传递分类主键的整数数组,格式为"categories": [1,2,3],不要传递嵌套对象格式的参数,否则也会触发校验报错。
内容的提问来源于stack exchange,提问作者soubhagya
相关产品推荐
相关产品推荐

