【问题标题】:"Incorrect type. Expected pk value, received list." Error DRF React“类型不正确。预期的 pk 值,收到的列表。”错误 DRF 反应
【发布时间】:2021-07-03 04:27:09
【问题描述】:

尝试发布请求多对多关系时出错

问题是

当我将列表放入请求时它显示错误:“类型不正确。预期的 pk 值,接收列表。” .但它是m2m领域所以我怎么能

查看

class PostList(generics.ListCreateAPIView):
    queryset = Post.objects.all()
    serializer_class = serializers.PostSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
    parser_classes = (MultiPartParser, FormParser)

    def post(self, request, *args, **kwargs):
        print(request.data['categories'])
        file_serializer = serializers.PostSerializer(data=request.data)
        print(request.data.dict())
        if file_serializer.is_valid():
                print(request.data)
                file_serializer.save(owner=self.request.user)
                return Response(file_serializer.data, status=status.HTTP_201_CREATED)
        else:
                return Response(file_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

序列化器

class PostSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    comments = serializers.PrimaryKeyRelatedField(many=True,queryset=Comment.objects.all())
    categories = serializers.PrimaryKeyRelatedField(many=True,queryset=Category.objects.all())

    class Meta:
        model = Post
        fields = ['id', 'title', 'body','owner','notify_users' ,'comments', 'categories','image']
 

我发送的请求

{
'title': 'my demo Title',
 'body': 'it is my demo /nCode for the desc for body',
 'categories': ['1', '2', '3', '4', '5', '6', '7'],
 'image': image
}

此代码没有错误

{
'title': 'my demo Title',
 'body': 'it is my demo /nCode for the desc for body',
 'categories': '1',
 'image': image
}

GitHub Repo

【问题讨论】:

    标签: django django-models django-rest-framework django-views m2m


    【解决方案1】:

    当我尝试在 request.data 中手动添加所有者字段时,我也面临同样的问题。

    我的序列化程序类

    fields = ("file", "name", "size", "owner")
    

    在我看来

    request.data['owner'] = request.user
    file_serializer = FileSerializer(data=request.data)
        if file_serializer.is_valid():
            file_serializer.save()
    

    在我的模型中

    owner = models.OneToOneField(User, primary_key=True, on_delete=models.CASCADE)
    

    【讨论】:

      最近更新 更多