在Django Restful中,ListSerializer何时被调用?

3

我有以下代码在我的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!, 这显然不是预期的结果

根据文档:

... 定制多个对象的 create 或 update 行为。 对于这些情况,您可以通过在序列化器 Meta 类上使用 list_serializer_class 选项来修改在 many=True 时使用的类。

那么我理解错了什么吗?我在我的post请求中传递了 many:False ,但是它仍将 create 函数委托给了 FileListSerializer


POST请求中的{"many": False}对序列化器没有任何意义。在API视图中实例化序列化器时,您是否传递了关键字参数many=False?您应该在此处添加视图代码。 - slider
1个回答

3
根据文档:
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)

可能是如何使用Django Rest Framework创建多个模型实例的重复问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接