在django-rest-framework 3.x中进行批量创建的规范方法?

Que*_*lan 9 python django django-rest-framework

在2.x中我们有一个看起来像的序列化器:

class FooSerializer(serializers.ModelSerializer):
    bar = serializers.PrimaryKeyRelatedField()

    class Meta:
        model = Foo
Run Code Online (Sandbox Code Playgroud)

这实际上能够处理批量创建(传递list作为JSON帖子请求的主体).在3.x中,此端点已损坏.我试图实现类似于DRF文档的东西

class FooListSerializer(serializers.ListSerializer):
    def create(self, validated_data):
        foos = [Foo(**item) for item in validated_data]
        return Foo.objects.bulk_create(foos)

class FooSerializer(serializers.ModelSerializer):
    bar = serializers.PrimaryKeyRelatedField(
        queryset=Bar.objects.all()
        )

    class Meta:
        model = Foo
        list_serializer_class = FooListSerializer
Run Code Online (Sandbox Code Playgroud)

虽然这适用于单个创建请求,但当我尝试传递列表时,我收到错误:

AttributeError: 'FooListSerializer' object has no attribute 'object'
Run Code Online (Sandbox Code Playgroud)

我已经看到一些__init__超级硬件,但似乎ListSerializer在3.x中创建了类,必须有一个更清晰的方法来做到这一点.提前致谢.

big*_*ose 8

你没有展示你的代码是如何创建一个FooSerializer实例的。在Django的REST框架3文档说:

要序列化查询集或对象列表而不是单个对象实例,您应该many=True在实例化序列化程序时传递标志。然后,您可以传递要序列化的查询集或对象列表。

因此,您的代码似乎应该检测数据是否包含一个或多个实例,并且:

  • serializer = FooSerializer() 处理一个实例,或
  • serializer = FooSerializer(many=True) 处理许多实例的列表。

显式优于隐式 :-)