У меня есть следующие модели:фильтрация внутри Джанго Rest Framework поле
class Project(models.Model):
"""
Describe a Project
"""
name = models.CharField(max_length=100)
classroom = models.ManyToMany(Classroom)
...
tags = models.ManyToManyField(Tag, blank=True)
class Tag(models.Model):
name = models.CharField(max_length=30)
classroom = models.ForeignKey(Classroom)
Проект представляет принадлежащий к несколько классу. Пользователь может прикреплять теги к проектам в зависимости от класса. Например:
Classroom A:
Project 1 -> Tags:Math,English
Classroom B:
Project 1 -> Tags:English
Я разработал API с платформой Django Rest Framework, чтобы получить проекты и связанные с ними теги.
Request: GET /api/projects/1
Response:
{
"name":"Project 1",
"id": 1,
"classroom" : [
"ClassroomA","ClassroomB"
],
"tags":[
"Math","English"
]
}
Что мне нужно добиться того, когда я filetring на классе, только у связанных тегов в моем réponse, например:
Request: GET /api/projects/1/?classroom=ClassroomA
Response:
{
"name":"Project 1",
"id": 1,
"classroom" : [
"ClassroomA"
],
"tags":[
"Math","English"
]
}
Request: GET /api/projects/1/?classroom=ClassroomB
Response:
{
"name":"Project 1",
"id": 1,
"classroom" : [
"ClassroomB"
],
"tags":[
"English"
]
}
Я могу фильтровать результаты API, но Я не в состоянии фильтровать внутри каждого полей в зависимости от класса по параметрам GET:
# serializers.py
class ProjectSerializer(serializers.ModelSerializer):
classroom = serializers.SlugRelatedField(many=True, read_only=True, slug_field='name')
tags = serializers.SlugRelatedField(many=True, slug_field='name', read_only=True)
# filter.py
import django_filters
from ...models import Project
class ProjectFilter(django_filters.FilterSet):
classroom = django_filters.CharFilter(name="classroom__name")
class Meta:
model = Project
fields = ['classroom']
# views.py
class SimViewSet(ReadProductPermission, viewsets.ModelViewSet):
serializer_class = ProjectSerializer
filter_class = ProjectFilter
queryset = Project.objects.all()
у вас есть какие-либо идеи, как я могу выполнить это?