我有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
!
答案 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?