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

