Django Rest框架(对ManyToMany字段的GET过滤器) [英] Django Rest Framework (GET filter on ManyToMany field)
问题描述
我试图找出如何通过值来过滤ManyToMany字段。在Django中,它和queryset.filter(m2mfield__name)一样简单,但是我不清楚我失踪了什么。我正在使用 Django Rest Framework 和 DjangoFilterBackend 。
模型: / strong>
class City(models.Model):
name = models.CharField(max_length = 80)
类状态(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
查看:
从rest_framework.generics导入ListAPIView,RetrieveAPIView
从.serializers import StateSerializer
class StateList(ListAPIView):
queryset = State.objects.all()
serializer_class = StateSerializer
filter_fields =('name','cities')
../api/states/的输出目前为:
[
pre>
name:Florida,
cities:[
name:Tampa,
name圣彼得堡,
名称:奥兰多
],
名称:北卡罗来纳州,
cities:[
name Raleigh,
name:Charlotte,
name:Greensboro
]
]
如何通过GET调用过滤城市,例如:
../ api / states /?cities = Charlotte
上面的结果应该是:
[
pre>
name:North Carolina,
cities:[
name Raleigh,
name:Charlotte,
name:Greensboro
]
]
解决方案嗯,我发现我做错了什么,在这个视图中,我没有在查看:
from .serializers import StateSeria lizer
from .filters import StateFilter
class StateList(ListAPIView):
queryset = State.objects.all()
serializer_class = StateSerializer
filter_fields = ('name','cities')
filter_class = StateFilter#这是缺少
我不小心把它放在串行器上。
I am trying to figure out how to filter a ManyToMany field by value. In Django, it is as simple as queryset.filter(m2mfield__name), but I can't quite figure out what I am missing. I am using the Django Rest Framework, and the DjangoFilterBackend.
Models:
class City(models.Model): name = models.CharField(max_length=80) class State(models.Model): name = models.CharField(max_length=50) cities = models.ManyToManyField(City)
Filters:
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')
Serializers:
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
View:
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')
The output for ../api/states/ is currently:
[ "name": "Florida", "cities": [ "name": "Tampa", "name": "St. Petersburg", "name": "Orlando" ], "name": "North Carolina", "cities": [ "name": "Raleigh", "name": "Charlotte", "name": "Greensboro" ] ]
How can I filter the cities via a GET call by name such as:
../api/states/?cities=Charlotte
The result of the above should be:
[ "name": "North Carolina", "cities": [ "name": "Raleigh", "name": "Charlotte", "name": "Greensboro" ] ]
解决方案Well, I found out what I was doing wrong. It was in the view. I had not declared filter_class on the view:
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
I accidentally placed it on the serializer instead.
这篇关于Django Rest框架(对ManyToMany字段的GET过滤器)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!