Django rest框架无法处理模型视图集中的多个对象

时间:2017-04-20 17:13:25

标签: django django-rest-framework

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

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'对象不可调用

我在这里缺少什么?

1 个答案:

答案 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

DRF docs regarding get_serializer (under methods)

Python docs regarding isinstance