Django Restful中的ListSerializer - 什么时候调用?

时间:2018-04-26 23:25:58

标签: python django django-rest-framework

我有serializers.py的以下代码:

from rest_framework import serializers

from django.db import transaction
from secdata_finder.models import File

class FileListSerializer(serializers.ListSerializer):
    @transaction.atomic
    def batch_save_files(file_data):
        files = [File(**data) for data in file_data]
        return File.objects.bulk_create(files)

    def create(self, validated_data):
        print("I am creating multiple rows!")
        return self.batch_save_files(validated_data)

class FileSerializer(serializers.ModelSerializer):
    class Meta:
        list_serializer_class = FileListSerializer
        model = File
        fields = (...) # omitted

我正在我的Django测试套件上试验它:

def test_file_post(self):
    request = self.factory.post('/path/file_query', {"many":False})
    request.data = {
        ... # omitted fields here
    }
    response = FileQuery.as_view()(request)

打印I am creating multiple rows!不是应该发生的事情

根据docs

  

...自定义多个对象的创建或更新行为。   对于这些情况,您可以通过使用序列化程序Meta类上的list_serializer_class选项来修改在传递many = True时使用的类。

那么我不理解什么?我在我的帖子请求中传递了many:False,但它仍然将create函数委托给FileListSerializer

1 个答案:

答案 0 :(得分:2)

根据文档:

  

ListSerializer类提供序列化和的行为   一次验证多个对象。您通常不需要使用   直接使用ListSerializer,但应该简单地传递many = True   实例化序列化程序

您可以将many=True添加到序列化程序

class FileSerializer(serializers.ModelSerializer):

def __init__(self, *args, **kwargs):
    kwargs['many'] = kwargs.get('many', True)
    super().__init__(*args, **kwargs)

潜在的How do I create multiple model instances with Django Rest Framework?