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

DRF序列化器创建ManyToMany字段报错问题排查求助

问题根因

报错的核心原因是序列化器中同时配置了depth=1和显式定义了categories的PrimaryKeyRelatedField,两者在处理多对多字段的反序列化逻辑时产生了冲突。
depth是DRF提供的用于简化查询时嵌套序列化输出的参数,仅对正向序列化(返回数据给前端)生效,但是配置后会覆盖你显式声明的关联字段的反序列化规则,导致多对多字段的提交逻辑失效。

修复方案

  1. 直接移除序列化器Meta中的depth=1配置即可解决创建报错的问题,修改后的序列化器如下:
class CreatorRawArtworkSerializer(serializers.ModelSerializer):
    categories = serializers.PrimaryKeyRelatedField(queryset=DesignerCategories.objects.all(), many=True)

    class Meta:
        model = CreatorRawArtwork
        fields = "__all__"
  1. 如果你需要在查询时返回分类的详细信息,不要使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:45:06