2014-09-19 1 views
4

ManyToMany 필드를 값으로 필터링하는 방법을 찾으려고합니다. Django에서는 queryset.filter (m2mfield__name)와 같이 간단하지만 빠진 항목을 파악할 수는 없습니다. Django Rest FrameworkDjangoFilterBackend을 사용하고 있습니다.Django Rest Framework (ManyToMany 필드의 GET 필터)

모델 :

class City(models.Model): 
    name = models.CharField(max_length=80) 

class State(models.Model): 
    name = models.CharField(max_length=50) 
    cities = models.ManyToManyField(City) 

필터 :

import django_filters 

class StateFilter(django_filters.FilterSet): 
    cities = django_filters.CharFilter(
     name='cities__name', 
     lookup_type='contains', 
    ) 

    class Meta: 
     model = State 
     fields = ('name', 'cities') 

직렬 변환기 :

class CitySerializer(serializers.ModelSerializer): 
    class Meta: 
     model = City 
     fields = ('name',) 

class StateSerializer(serializers.ModelSerializer): 
    cities = CitySerializer(many=True) 

    class Meta: 
     model = State 
     fields = ('name', 'cities') 
     filter_class = StateFilter 

보기 :

from rest_framework.generics import ListAPIView, RetrieveAPIView 
from .serializers import StateSerializer 

class StateList(ListAPIView): 
    queryset = State.objects.all() 
    serializer_class = StateSerializer 
    filter_fields = ('name', 'cities') 

../api/states/의 출력이 현재 :

[ 
    "name": "Florida", 
    "cities": [ 
      "name": "Tampa", 
      "name": "St. Petersburg", 
      "name": "Orlando" 
    ], 
    "name": "North Carolina", 
    "cities": [ 
      "name": "Raleigh", 
      "name": "Charlotte", 
      "name": "Greensboro" 
    ] 
] 
내가 같은 이름으로 GET 호출을 통해 도시를 필터링 할 수 있습니다 방법

:

../api/states/?cities=Charlotte

위의 결과는 다음과 같아야합니다.

[ 
    "name": "North Carolina", 
    "cities": [ 
      "name": "Raleigh", 
      "name": "Charlotte", 
      "name": "Greensboro" 
    ] 
] 
+0

ViewSet을 표시 할 수 있습니까? – Zulu

+0

@ Zulu, 요청에 따라 ViewSet을 추가했습니다. –

+0

REST_FRAMEWORK = { 'FILTER_BACKEND': 'rest_framework.filters.DjangoFilterBackend', } –

답변

6

글쎄, 내가 잘못하고있는 것을 발견했다. 그것은 전망에있었습니다. 보기에 filter_class를 선언하지 않았습니다.

from rest_framework.generics import ListAPIView, RetrieveAPIView 
from .serializers import StateSerializer 
from .filters import StateFilter 

class StateList(ListAPIView): 
    queryset = State.objects.all() 
    serializer_class = StateSerializer 
    filter_fields = ('name', 'cities') 
    filter_class = StateFilter # This was missing 

우연히 대신 serializer에 입력했습니다.