4
ManyToMany 필드를 값으로 필터링하는 방법을 찾으려고합니다. Django에서는 queryset.filter (m2mfield__name)와 같이 간단하지만 빠진 항목을 파악할 수는 없습니다. Django Rest Framework 및 DjangoFilterBackend을 사용하고 있습니다.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"
]
]
ViewSet을 표시 할 수 있습니까? – Zulu
@ Zulu, 요청에 따라 ViewSet을 추가했습니다. –
REST_FRAMEWORK = { 'FILTER_BACKEND': 'rest_framework.filters.DjangoFilterBackend', } –