首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Django Rest框架( ManyToMany字段上的GET过滤器)

Django Rest框架( ManyToMany字段上的GET过滤器)
EN

Stack Overflow用户
提问于 2014-09-19 14:49:02
回答 1查看 7K关注 0票数 11

我试图找出如何通过值过滤ManyToMany字段。在Django中,它和queryset.filter(m2mfield__name)一样简单,但我不太清楚自己缺少了什么。我正在使用Django Rest框架DjangoFilterBackend

模型:

代码语言:javascript
运行
AI代码解释
复制
class City(models.Model):
    name = models.CharField(max_length=80)

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

滤波器:

代码语言:javascript
运行
AI代码解释
复制
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')

序列化程序:

代码语言:javascript
运行
AI代码解释
复制
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

视图:

代码语言:javascript
运行
AI代码解释
复制
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/的输出当前为:

代码语言:javascript
运行
AI代码解释
复制
 [
     "name": "Florida",
     "cities": [
          "name": "Tampa",
          "name": "St. Petersburg",
          "name": "Orlando"
     ],
     "name": "North Carolina",
     "cities": [
          "name": "Raleigh",
          "name": "Charlotte",
          "name": "Greensboro"
     ]
 ]

如何通过名GET调用来过滤城市,如:

../api/state/?城市=夏洛特

上述结果应是:

代码语言:javascript
运行
AI代码解释
复制
 [
     "name": "North Carolina",
     "cities": [
          "name": "Raleigh",
          "name": "Charlotte",
          "name": "Greensboro"
     ]
 ]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-19 15:16:44

我发现我做错了什么。它就在眼前。我没有在视图上声明filter_class:

代码语言:javascript
运行
AI代码解释
复制
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

我不小心把它放在序列化器上了。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25943426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档