Django rest框架无法处理模型视图集中的多个对象 [英] Django rest framework cannot deal with multple objects in model viewset
问题描述
我有一个非常简单的模型及其相关的序列化器和视图:
class Page(models.Model):
用户= models.ForeignKey(User)
title = models.CharField(max_length = 255)
pub_date = models.DateTimeField(default = timezone.now)
class PageSerializer(serializers.ModelSerializer) ):
类Meta:
模型=页面
字段=('用户','标题','发布日期')
类PageViewSet(viewsets.ModelViewSet) :
queryset = Page.objects.all()
serializer_class = PageSerializer
现在我可以发布了像这样:
{
用户:1,1,
标题: Lorem ipsum
}
这很好。但是我想发布多个这样的对象:
[
{
user:1,
title: Lorem ipsum one;
},
{
用户:1,
标题: Lorem ipsum two;
}
]
但这给我一个错误:
non_field_errors:[
无效数据。应该有字典,但要有清单。
]
因此要接受多个对象我根据文档修改了视图:
class PageViewSet(viewsets.ModelViewSet):
queryset = Page.objects.all()
serializer_class = PageSerializer(queryset,many = True)
但是我遇到错误:
上的blockquote>
TypeError
'ListSerializer'对象不可调用
我在这里缺少什么?
您之前已经正确设置了它,serializer_class应该指向此类:
serializer_class = PageSerializer
您是对的错误,它不喜欢在POST中接收多个对象。解决该问题的一种方法是在视图中覆盖get_serializer方法,在其中添加many = True。
类似的东西:
def get_serializer(self,* args,** kwargs):
如果kwargs中有数据:
data = kwargs [ data ]
#检查是否需要很多
如果isinstance(数据,列表):
kwargs [ many] = True
return super( PageViewSet(self).get_serializer(* args,** kwargs)
在评论中回答您的问题: isinstance()
是检查对象类型的Python方法。在这种情况下,传入多个对象时它是一个列表
,因此我们只需检查 data
是什么类型并设置 many = true
如果它是列表
。
I have a very simple model and its related serializer and views:
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
Now I can post like this:
{
"user": 1,
"title": "Lorem ipsum"
}
This works fine. But I would like to post multiple objects like this:
[
{
"user": 1,
"title": "Lorem ipsum one"
},
{
"user": 1,
"title": "Lorem ipsum two"
}
]
But this gives me an error:
"non_field_errors": [
"Invalid data. Expected a dictionary, but got list."
]
So to accept multple objects I modified the view as per the doc:
class PageViewSet(viewsets.ModelViewSet):
queryset = Page.objects.all()
serializer_class = PageSerializer(queryset, many=True)
But I am getting an error:
TypeError at /api/blog/pages/
'ListSerializer' object is not callable
What am I missing here?
You had it set up correctly before, the serializer_class should point to the class like this:
serializer_class = PageSerializer
You were right on the error, it doesn't like receiving multiple objects in the POST. One way to fix it would be to override the get_serializer method n the view, adding in many=True there.
Something like:
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)
To answer your question in the comments: isinstance()
is a Python method to check the type of an object. In this case, it's a list
when passing in multiple objects, so we just check what type data
is and set many=true
if it's a list
.
DRF docs regarding get_serializer (under methods)
Python docs regarding isinstance
这篇关于Django rest框架无法处理模型视图集中的多个对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!