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

Rob*_*bin 3 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
Run Code Online (Sandbox Code Playgroud)

现在我可以像这样张贴:

{
    "user": 1,
    "title": "Lorem ipsum"
}
Run Code Online (Sandbox Code Playgroud)

这很好用.但是我想发布这样的多个对象:

[
    {
        "user": 1,
        "title": "Lorem ipsum one"
    },
    {
        "user": 1,
        "title": "Lorem ipsum two"
    }
]
Run Code Online (Sandbox Code Playgroud)

但这给了我一个错误:

"non_field_errors":[

"Invalid data. Expected a dictionary, but got list."
Run Code Online (Sandbox Code Playgroud)

]

因此,为了接受多个对象,我按照文档修改了视图:

class PageViewSet(viewsets.ModelViewSet):
    queryset = Page.objects.all()
    serializer_class = PageSerializer(queryset, many=True)
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

/ api/blog/pages /中的TypeError

'ListSerializer'对象不可调用

我在这里错过了什么?

Cod*_*ker 7

之前你已经正确设置了,serializer_class应该像这样指向类:

serializer_class = PageSerializer
Run Code Online (Sandbox Code Playgroud)

你是对的错误,它不喜欢在POST中接收多个对象.修复它的一种方法是覆盖视图中的get_serializer方法,在那里添加many = 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)
Run Code Online (Sandbox Code Playgroud)

在注释中回答您的问题:isinstance()是一种检查对象类型的Python方法.在这种情况下,它是一个list传递多个对象的时候,所以我们只检查它data是什么类型并设置many=true它是否是a list.

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

关于isinstance的Python文档