2015-02-10 8 views
0

У меня есть следующие модели:фильтрация внутри Джанго 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() 

у вас есть какие-либо идеи, как я могу выполнить это?

ответ

Смежные вопросы