Django Rest框架(对ManyToMany字段的GET过滤器) [英] Django Rest Framework (GET filter on ManyToMany field)

查看:948
本文介绍了Django Rest框架(对ManyToMany字段的GET过滤器)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图找出如何通过值来过滤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/的输出目前为:

  [
name:Florida,
cities:[
name:Tampa,
name圣彼得堡,
名称:奥兰多
],
名称:北卡罗来纳州,
cities:[
name Raleigh,
name:Charlotte,
name:Greensboro
]
]
pre>

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


../ api / states /?cities = Charlotte


上面的结果应该是:

  [
name:North Carolina,
cities:[
name Raleigh,
name:Charlotte,
name:Greensboro
]
]
pre>

解决方案

嗯,我发现我做错了什么,在这个视图中,我没有在查看:

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆