Как создать несколько ресурсов одним запросом Django Rest Framework? - PullRequest
1 голос
/ 27 января 2020

Я получил модель Slider, которая имеет простую связь с ImageSlider, благодаря ModelViewSet я могу создавать ползунки, а затем создавать ImageSliders и связывать их с помощью ползунка. Но я бы также хотел бы иметь возможность просто загрузить несколько изображений и сделать несколько изображений SliderImage и сопоставить их с одним и тем же ползунком. Я имею в виду, что я хочу иметь оба варианта, но я не уверен, как это сделать и как чтобы проверить это с чем-то вроде почтальона. Я надеюсь, что вы, ребята, можете помочь мне понять, что, поскольку я все еще изучаю DRF

Просмотр слайдера

"""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 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 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',
       )

Сериализатор изображений слайдера

"""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',
       )

Я забочусь только о загрузке файлов и создании / хранении ресурсов, другие поля в ImageSlider не обязательны

1 Ответ

1 голос
/ 28 января 2020

Для этой цели вы можете создать другую конечную точку, используя actions . Предполагая, что SliderImage уже создан, он будет выглядеть примерно так:

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)

Если SliderImageSerializer будет вашим новым сериализатором, а ваша конечная точка будет такой же, как и зарегистрированная для SliderImageViewSet, но с /<id>/images в конец, где id - это идентификатор вашего ранее созданного SliderImage.

...