DRF ManyToMany Field 在创建对象时出错

问题描述 投票:0回答:3

我有一个

Rant
模型,
Category
使用
ManyToManyField
链接到它。我已经序列化了,但问题是这个错误:

{
  "categories": [
    "Expected a list of items but got type \"str\"."
  ]
}

这些是我的序列化程序:

class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = "__all__"


class RantSerializer(serializers.ModelSerializer):
    categories = CategorySerializer(many=True)


    class Meta:
        model = Rant
        fields = ('rant', 'slug', 'categories')

我的

post
方法是这样的:

    def post(self, request, format=None):
        serializer = RantSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我做错了什么?

python django django-rest-framework django-queryset
3个回答
0
投票

目前你可能会发送一个像这样的请求,

{
    "rant": "This is my rant",
    "slug": "my-rant",
    "categories": 1
}

由于类别是多对多关系,它需要一个 id 列表,

试试这个:

{
    "rant": "This is my rant",
    "slug": "my-rant",
    "categories": [1, 2, 3]
}

0
投票

问题出在序列化器上,而你的序列化器是只读的,因此 serializer.save() 没有效果。

为了改变这种行为,你需要覆盖serializer方法:create()和update(),或/和save()。

查看此文档以了解实施细节:https://www.django-rest-framework.org/api-guide/serializers/#saving-instances


0
投票

我遇到过类似的问题。执行以下操作来解决您的问题

  1. 使用
    pip install drf-writable-nested
  2. 安装 drf-writable-nested
  3. 像这样重写你的序列化器
# --- snip ---
from drf_writable_nested.serializers import WritableNestedModelSerializer

class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = "__all__"


class RantSerializer(WritableNestedModelSerializer):
    categories = CategorySerializer(many=True)


    class Meta:
        model = Rant
        fields = ('rant', 'slug', 'categories')
# ---snip ----

这里的问题是导入和实现

WritableNestedModelSerializer
类。另请注意,
serializers.ModelSerializer
超类已在要执行嵌套有效负载的序列化程序上被替换。

  1. 尝试执行 API 调用。你应该可以走了。

有关更多信息,请参阅此 repo 的自述文件此处

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.