How to Query model filed elements in the same URL

newb :

I am writing a single model application in DRF. My model looks like this:

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()

My viewset looks like this:

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)

and finally, my router is:

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

Now how do I set a URL,so I would query the members field like: //superhero/{id}/members to get specific id members. I tried drf nested URL but didn't work. The url I have works for superhero/ and superhero/{id}.

Artur Shyshko :

You should use detailed viewset action.

Your code would looks smth like this:

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)

You should also probably use custom serializer for members and in response return: return Response(CustomSerializer(members).data)

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=220118&siteId=1