Как использовать ListSerializer для создания и обновления нескольких записей в django rest framework?

Вот способ создания и обновления нескольких записей одновременно в django rest framework с помощью ListSerializer. Этот способ очень удобен и дает быстрый отклик.

Когда вы хотите создать объект, передайте id: null, потому что id является обязательным полем, а когда вы хотите обновить записи, передайте конкретный id.

Вот ответ:

models.py

class BookDetail(models.Model):
    author = models.ForeignKey('bookapp.Author', null=True, on_delete=models.CASCADE)
    title = models.CharField(max_length=255, null=True, blank=True)
    price = models.CharField(max_length=100, null=True, blank=True)
    discount = models.FloatField(default=0)
    tax_percentage = models.IntegerField(default=0)
    total_price = models.FloatField(default=0)

    created_at = models.DateTimeField(auto_now_add=True, editable=False)
    modified_at = models.DateTimeField(auto_now=True)

serializer.py

class BookDetailsListSerializer(serializers.ListSerializer):
    def update(self, instance, validated_data):
        # Perform creations and updates.
        ret = []

        for data in validated_data:
            if "id" in data and data['id'] not in ['', None]:
                BookDetail.objects.filter(id=data['id']).update(**data)
                ret.append(data)
            else:
                ret.append(BookDetail.objects.create(**data))
        return ret

    
class BookDetailsSerializer(serializers.ModelSerializer):
    class Meta:
        model = BookDetail
        fields = ['id', 'author', 'title', 'price', 'discount', 'tax_percentage', 'total_price']
        list_serializer_class = BookDetailsListSerializer
        extra_kwargs = {
            # We need to identify elements in the list using their primary key,
            # so use a writable field here, rather than the default which would be read-only.
            'id':{
                'read_only': False,
                'allow_null': True,
            },
            'author':{
                'required': True,
            },
            'title':{
                'required': True,
            },
            'price':{
                'required': True,
            },
            'discount':{
                'required': True,
            },
            'tax_percentage':{
                'required': True,
            },
            'total_price':{
                'required': True,
            }
        }

urls.py

path('book-details', views.BookDetailsView.as_view()),

views.py

class BookDetailsView(APIView):
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)
    serializer_class = BookDetailsSerializer

    def get(self, request, *args, **kwargs):
        author_id = request.GET.get('author_id', None)
        bookdtl_obj = BookDetail.objects.filter(author__id=a)
        serializer = self.serializer_class(bookdtl_obj, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)
    
    def post(self, request, *args, **kwargs):
        data = request.data
        serializer = self.serializer_class(instance='',data=data, many=True)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Здесь я приложил скриншот создания нескольких объектов книги с помощью postman:

enter image description here

Вот, я приложил скриншот обновления нескольких объектов книги с помощью postman:

enter image description here

Вернуться на верх