【问题标题】:Create several objects at once Django Rest Framework Generic Views一次创建多个对象 Django Rest Framework Generic Views
【发布时间】:2021-12-04 18:55:09
【问题描述】:

我正在使用 Django Rest 框架。我正在尝试创建一个 ListCreateAPIView 来一次创建多个对象,但到目前为止我发现的任何东西似乎都不起作用,不知道为什么。

#My view
class MyListCreateView(ListCreateAPIView):
    serializer_class = MySerializer

    def get_queryset(self):
        return Mymodel.objects.filter(user=self.request.user.id)

    # tried this with no luck
    def get_serializer(self, instance=None, data=None, many=False, partial=False):
        if data is not None:
            data.is_valid(raise_exception=True)
            return super(MyListCreateView, self).get_serializer(instance=instance, data=data, many=True, partial=partial)
        else:
            return super(MyListCreateView, self).get_serializer(instance=instance, many=True, partial=partial)

    def perform_create(self, serializer):
        user_obj = self.request.user
        serializer.save(user=user_obj)

#my serializer
class MySerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'

【问题讨论】:

    标签: django django-rest-framework django-serializer


    【解决方案1】:

    让我们从头开始:

    • 这是带有动态 many 参数的常规 View。参数many 本身不会让您的序列化程序一次创建多个对象。要使many 按预期工作,我们需要ListSerializer

       class MyView(ListCreateAPIView):
           ...
           def create(self, request, *args, **kwargs):
               data = request.data
               serializer = MySerializer(data=data, many=isinstance(data, list))
               serializer.is_valid(raise_exception=True)
               serializer.save()
      
    • 使用create 函数创建ListSerializer,如下所示:

       class MyListSerializer(serializers.ListSerializer):
           ...
           def create(self, validated_data):
               items = [MyModel(**item) for item in validated_data]
               return MyModel.objects.bulk_create(items)
      
    • 最后在主序列化程序的 Meta 类中将 list_serializer_class 字段值设置为 MyListSerializer

       class MySerializer(serializers.Serializer):
           ...
           def create(self, validated_data):
               return MyModel.objects.create(**validated_data)
      
           class Meta:
               list_serializer_class = MyListSerializer
      

    您可以阅读自定义序列化程序行为 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-02
      • 2021-08-01
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      相关资源
      最近更新 更多