1

I'm using Django Rest Framework. I'm trying to create a ListCreateAPIView to create several objects at once but nothing I've found so far seems to work and not sure why.

#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__'
Taras Mykhalchuk
  • 829
  • 1
  • 9
  • 20

1 Answers1

1

Let's start from the top:

  • This is a regular View with a dynamic many argument. Argument many itself doesn't make your serializer create multiple objects at once. For many to work as expected we need 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 with create function like the following:

     class MyListSerializer(serializers.ListSerializer):
         ...
         def create(self, validated_data):
             items = [MyModel(**item) for item in validated_data]
             return MyModel.objects.bulk_create(items)
    
  • And finally in your main serializer's Meta class set list_serializer_class field value to MyListSerializer.

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

You can read up on the custom serializer behavior here

Taras Mykhalchuk
  • 829
  • 1
  • 9
  • 20