How do I filter in URL a serializer when it's nested in another serializer In Django?

Viewed 78

I'm creating an API which has nested data like in the picture enter image description here

Now how to search nested data in URL here's my model

class Robot(models.Model):
    robot = models.CharField(max_length=100)
    short_Description = models.CharField(max_length=200)
    status = models.CharField(max_length=20)
    parameter = models.CharField(max_length=200)
    jenkins_job = models.CharField(max_length=100, default='JenkinsJobName')
    jenkins_token = models.CharField(max_length=100, default='JenkinsToken')
    def __str__(self):
        return self.robot

class assignParameter(models.Model): 
    parameterName = models.CharField(max_length=100, blank=True)
    assignRobot= models.ForeignKey(Robot, on_delete=models.CASCADE, related_name='param', blank=True, null=True)

Here's my serializer.py

from .models import Robot,assignParameter
from rest_framework import serializers

class assignParameterSerializer(serializers.ModelSerializer):
    class Meta: 
        model = assignParameter
        fields = ['id', 'parameterName', 'assignRobot']


class RobotSerializer(serializers.ModelSerializer):
    param = assignParameterSerializer(many=True, read_only=True)
    JenkinJobName = jenkinsHistorySerializer(many=True, read_only=True)
    class Meta: 
        model = Robot
        fields = ['id', 'robot', 'short_Description', 'status', 'parameter', 'jenkins_job', 'jenkins_token', 'param']

and here's my view for the api

class RobotViewSet(mixins.ListModelMixin,GenericViewSet):
    queryset = Robot.objects.all()
    serializer_class = RobotSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['robot']
    authentication_classes = [BasicAuthentication]
    permission_classes = [IsAuthenticated]

in the api url if i want to search particular robot then using this url url/?robot=robotname i'm able to search that particular robot . But how can i search particular nested data using URL?

1 Answers

Using django-filter:

views.py

from django_filters import rest_framework as filters

...
filter_backends = (filters.DjangoFilterBackend,)
filterset_fields = ['param__parameterName']

You can use filterset_fields = ['param__parameterName'] for filtering over params name of robot

E.g url/?param__parameterName='sth' would filter robots that has param with name 'sth'

Related