Reputation: 567
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
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