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

Django DRF多对多关联添加项时出现OrderedDict无pk属性错误

AttributeError: 'collections.OrderedDict' object has no attribute 'pk' 多对多关联创建成功但响应失败

问题根源

你的问题出在perform_create方法的错误实现上:当通过mybox/<int:pk>/documents/创建文档时,你重新实例化了一个DocumentSerializer并覆盖了视图传入的原序列化器对象。视图在创建完成后,会尝试使用这个被覆盖的序列化器来序列化返回数据,但这个新序列化器并没有绑定到刚创建的Document实例上,导致序列化流程出错,抛出AttributeError。

解决方案

直接使用视图传入的serializer对象完成保存操作,不需要重新实例化。修改后的perform_create方法如下:

class DocumentList(generics.ListCreateAPIView):
    # 其他代码保持不变
    def perform_create(self, serializer):
        mybox_id = self.kwargs.get('pk', None)
        # 直接使用传入的serializer保存文档
        document = serializer.save(owner=self.request.user)
        if mybox_id:
            print("Hay ID de MyBox")
            mybox = MyBox.objects.get(pk=mybox_id)
            mybox.documents.add(document)
        else:
            print("No hay ID de MyBox")

额外优化建议(可选)

如果希望支持在创建文档时直接通过请求体传入关联的MyBox ID,而非仅通过URL参数,可以修改DocumentSerializer,添加一个写入专用的字段:

class DocumentSerializer(serializers.HyperlinkedModelSerializer):
    mybox = MyBoxSerializer(many=True, read_only=True)
    # 新增写入用的mybox_ids字段,仅用于接收输入
    mybox_ids = serializers.PrimaryKeyRelatedField(
        queryset=MyBox.objects.all(),
        many=True,
        write_only=True,
        required=False
    )
    owner = serializers.ReadOnlyField(source='owner.username')

    class Meta:
        model = Document
        fields = ['url', 'id', 'owner', 'description', 'file', 'mybox', 'mybox_ids']

    def create(self, validated_data):
        # 取出mybox_ids并从验证数据中移除
        mybox_ids = validated_data.pop('mybox_ids', [])
        document = super().create(validated_data)
        # 批量关联MyBox
        document.mybox.add(*mybox_ids)
        return document

这样你既可以通过URL参数关联单个MyBox,也可以通过请求体传入多个MyBox ID完成关联。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:50:46