Создание нескольких объектов одновременно Django Rest Framework Generic Views
Я использую Django Rest Framework. Я пытаюсь создать 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__'```
Начнем с самого начала:
Это обычный
View
с динамическимmany
аргументом. Аргумент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()
Создайте
ListSerializer
с помощью функцииcreate
следующим образом: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
Почитать о поведении пользовательского сериализатора можно здесь: https://www.django-rest-framework.org/api-guide/serializers/#customizing-listserializer-behavior