我有一个非常简单的模型及其相关的序列化器和视图:
class Page(models.Model):
user = models.ForeignKey(User)
title = models.CharField(max_length=255)
pub_date = models.DateTimeField(default=timezone.now)
class PageSerializer(serializers.ModelSerializer):
class Meta:
model = Page
fields = ('user', 'title', 'pub_date')
class PageViewSet(viewsets.ModelViewSet):
queryset = Page.objects.all()
serializer_class = PageSerializer
现在我可以这样张贴:
{
"user": 1,
"title": "Lorem ipsum"
}
这很好用。但是我想发布这样的多个对象:
[
{
"user": 1,
"title": "Lorem ipsum one"
},
{
"user": 1,
"title": "Lorem ipsum two"
}
]
但这给了我一个错误:
“non_field_errors”:[
"Invalid data. Expected a dictionary, but got list."
因此,为了接受多个对象,我修改了视图as per the doc:
class PageViewSet(viewsets.ModelViewSet):
queryset = Page.objects.all()
serializer_class = PageSerializer(queryset, many=True)
但是我收到了一个错误:
/ api / blog / pages /
中的TypeError'ListSerializer'对象不可调用
我在这里缺少什么?
答案 0 :(得分:6)
之前你已经正确设置了,serializer_class应该像这样指向类:
serializer_class = PageSerializer
你是对的错误,它不喜欢在POST中接收多个对象。修复它的一种方法是在视图中覆盖get_serializer方法,在那里添加许多= True。
类似的东西:
def get_serializer(self, *args, **kwargs):
if "data" in kwargs:
data = kwargs["data"]
# check if many is required
if isinstance(data, list):
kwargs["many"] = True
return super(PageViewSet, self).get_serializer(*args, **kwargs)
要在评论中回答您的问题:isinstance()
是一种检查对象类型的Python方法。在这种情况下,当传入多个对象时,它会list
,因此我们只检查data
的类型,并设置many=true
如果它是list