Django rest框架无法处理模型视图集中的多个对象 [英] Django rest framework cannot deal with multple objects in model viewset

查看:87
本文介绍了Django rest框架无法处理模型视图集中的多个对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个非常简单的模型及其相关的序列化器和视图:

  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 如果它是列表



关于get_serializer的DRF文档(在方法下)



有关isinstance的Python文档


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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆