我有一个
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)
我做错了什么?
目前你可能会发送一个像这样的请求,
{
"rant": "This is my rant",
"slug": "my-rant",
"categories": 1
}
由于类别是多对多关系,它需要一个 id 列表,
试试这个:
{
"rant": "This is my rant",
"slug": "my-rant",
"categories": [1, 2, 3]
}
问题出在序列化器上,而你的序列化器是只读的,因此 serializer.save() 没有效果。
为了改变这种行为,你需要覆盖serializer方法:create()和update(),或/和save()。
查看此文档以了解实施细节:https://www.django-rest-framework.org/api-guide/serializers/#saving-instances
我遇到过类似的问题。执行以下操作来解决您的问题
pip install drf-writable-nested
# --- 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
超类已在要执行嵌套有效负载的序列化程序上被替换。
有关更多信息,请参阅此 repo 的自述文件此处