Anibal Cardozo
Anibal Cardozo

Reputation: 567

How to create several resources with one request Django Rest Framework?

I got a model Slider that has a simple one to many relationship with ImageSlider, thanks to ModelViewSet I can create sliders and then create ImageSliders and asociate them with a slider. But I would also like to be able to just upload a bunch of images and make several SliderImages and asociate them with the same slider I mean I want to have both options but Im not sure how to do that and how to test it with something like Postman. I hope you guys can help me understand that since Im still learning about DRF

Slider View

"""Slider view"""

# Django REST Framework
from rest_framework import viewsets


# Serializers
from api.sliders.serializers import SliderModelSerializer

# Models
from api.sliders.models import Slider


class SliderViewSet(viewsets.ModelViewSet):
   """Slider viewset"""

   queryset = Slider.objects.all()
   serializer_class = SliderModelSerializer

Slider Image View

"""Slider Images view"""

# Django
from django.shortcuts import get_object_or_404

# Django REST Framework
from rest_framework import viewsets


# Serializers
from api.sliders.serializers import SliderImageModelSerializer

# Models
from api.sliders.models import SliderImage

class SliderImageViewSet(viewsets.ModelViewSet):
    """Slider Image viewset"""

    queryset = SliderImage.objects.all()
    serializer_class = SliderImageModelSerializer

Slider serializer

"""Slider Serializers"""

# Django Rest Framework
from rest_framework import serializers

# Serializers
from api.sliders.serializers import SliderImageModelSerializer

# Model
from api.sliders.models import Slider

class SliderModelSerializer(serializers.ModelSerializer):
   """ Slider Model Serializer. """
   images = SliderImageModelSerializer(many=True, read_only=True)

   class Meta:
       """Meta class"""
       model = Slider
       fields = (
           'id',
           'status',
           'images',
       )

Slider Image Serializer

"""SliderImage Serializers"""

# Django Rest Framework
from rest_framework import serializers

# Model
from api.sliders.models import SliderImage

class SliderImageModelSerializer(serializers.ModelSerializer):
   """ Slider Image Model Serializer. """
   slider_id = serializers.IntegerField()

   class Meta:
       """ Meta class """
       model = SliderImage
       fields = (
           'id',
           'url',
           'link',
           'slider_id',
       )

I only care about uploading the files and creating/storing the resources, the other fields in ImageSlider aren't necessary

Upvotes: 1

Views: 148

Answers (1)

alissongranemann
alissongranemann

Reputation: 992

You can make another endpoint for that purpose, using actions. Assuming a SliderImage is already created, it would be something like:

class SliderImageViewSet(viewsets.ModelViewSet):
    """Slider Image viewset"""

    queryset = SliderImage.objects.all()
    serializer_class = SliderImageModelSerializer

    @action(detail=True, methods=['post'])
    def images(self, request, pk=None):
        user = self.get_object()
        serializer = SliderImageSerializer(data=request.data)
        if serializer.is_valid():
            user.save()
            return Response({'status': 'images saved'})
        else:
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)

With SliderImageSerializer being your new serializer and your endpoint the same as registered to SliderImageViewSet, but with /<id>/images at the end, where id is the id of your SliderImage previously created.

Upvotes: 1

Related Questions