Как запросить модель полевых элементов в одном URL - PullRequest
0 голосов
/ 12 марта 2020

Я пишу одну модель приложения в DRF. Моя модель выглядит следующим образом:

class Superhero(models.Model):
    squad_name = models.CharField(max_length=100)
    hometown = models.CharField(max_length=30)
    formed = models.DateField()
    active = models.BooleanField()
    members = JSONField()

Мой набор выглядит следующим образом:

class SuperheroViewSet(viewsets.ViewSet):
    """
    A simple ViewSet for listing or retrieving superheros.
    """
    serializer_class = SuperheroSerializer

    def list(self, request):
        """list superhero object"""
        queryset = Superhero.objects.filter()
        serializer = SuperheroSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        queryset = Superhero.objects.filter()
        superhero = get_object_or_404(queryset, pk=pk)
        serializer = SuperheroSerializer(superhero)
        return Response(serializer.data)

и, наконец, мой маршрутизатор:

router = DefaultRouter()
router.register(r'superhero', SuperheroViewSet, basename='superhero')
urlpatterns = router.urls

Как мне теперь установить URL, поэтому я бы запросил поле members, например: // superhero / {id} / members, чтобы получить конкретные c идентификаторы членов. Я пробовал вложенный URL-адрес, но ничего не получалось. URL у меня работает для супергероя / и супергероя / {id}.

1 Ответ

1 голос
/ 12 марта 2020

Вы должны использовать подробное действие набора просмотра .

Ваш код будет выглядеть примерно так:

from rest_framework.decorators import action
from rest_framework.shortcuts import get_object_or_404
from rest_framework.response import Response

class SuperheroViewSet():
...

    @action(detail=True, methods=['get'], url_path='members')
    def get_superhero_members(self, request, pk=None):
        superhero = get_object_or_404(self.get_queryset(), pk=pk)
        members = <get members of your hero>
        return Response(members)

Вы также должны использовать пользовательский сериализатор для членов и в возврат ответа: return Response(CustomSerializer(members).data)

...