我试图找出如何通过值过滤ManyToMany字段。在Django中,它和queryset.filter(m2mfield__name)一样简单,但我不太清楚自己缺少了什么。我正在使用Django Rest框架和DjangoFilterBackend。
模型:
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/state/的输出当前为:
[
"name": "Florida",
"cities": [
"name": "Tampa",
"name": "St. Petersburg",
"name": "Orlando"
],
"name": "North Carolina",
"cities": [
"name": "Raleigh",
"name": "Charlotte",
"name": "Greensboro"
]
]
如何通过名GET调用来过滤城市,如:
../api/state/?城市=夏洛特
上述结果应是:
[
"name": "North Carolina",
"cities": [
"name": "Raleigh",
"name": "Charlotte",
"name": "Greensboro"
]
]
发布于 2014-09-19 15:16:44
我发现我做错了什么。它就在眼前。我没有在视图上声明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
我不小心把它放在序列化器上了。
https://stackoverflow.com/questions/25943426
复制相似问题