Как фильтровать по URL сериализатор, когда он вложен в другой сериализатор в Django?
Я создаю API, который имеет вложенные данные, как на картинке введите описание изображения здесь
Как искать вложенные данные в URL вот моя модель
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)
Вот мой 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']
и вот мой взгляд на 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]
В api url если я хочу найти конкретного робота, то используя этот url url/?robot=robotname я смогу найти этого конкретного робота. Но как я могу искать конкретные вложенные данные с помощью URL?
Использование django-filter
:
views.py
from django_filters import rest_framework as filters
...
filter_backends = (filters.DjangoFilterBackend,)
filterset_fields = ['param__parameterName']
Вы можете использовать filterset_fields = ['param__parameterName']
для фильтрации по params имени робота
Например, url/?param__parameterName='sth' будет фильтровать роботов, у которых есть параметр с именем 'sth'