过滤django休息框架

时间:2014-03-26 13:33:06

标签: python django django-rest-framework django-filters

在我的项目中,我使用django rest框架。要过滤结果,我使用django_filters后端。 有我的代码:

models.py

from django.db import models


class Region(models.Model):
    name = models.CharField(max_length=100, blank=True, null=False)


class Town(models.Model):
    region = models.ForeignKey(Region)
    name = models.CharField(max_length=100, blank=True, null=False')

filters.py

import django_filters
from models import Town


class TownFilter(django_filters.FilterSet):
    region = django_filters.CharFilter(name="region__name", lookup_type="contains")
    town = django_filters.CharFilter(name="name", lookup_type="contains")

    class Meta:
        model = Town
        fields = ['region', 'town']

views.py

from models import Town
from rest_framework import generics
from serializers import TownSerializer
from filters import TownFilter


class TownList(generics.ListAPIView):
    queryset = Town.objects.all()
    serializer_class = TownSerializer
    filter_class = TownFilter

因此,我可以将?region = Region_name& town = Town_name 写入请求网址的末尾,结果将被过滤。

但是我想在请求网址中只使用一个get参数,可以将区域城镇名称作为值。例如?search = Region_name ?search = Town_name 。我怎么能这样做?

1 个答案:

答案 0 :(得分:3)

有几个选项,但最简单的方法就是覆盖' get_queryset'在您的API视图中。

适用于您的用例的docs示例:

class TownList(generics.ListAPIView):
    queryset = Town.objects.all()
    serializer_class = TownSerializer
    filter_class = TownFilter(generics.ListAPIView)
    serializer_class = PurchaseSerializer

    def get_queryset(self):
        queryset = Town.objects.all()
        search_param = self.request.QUERY_PARAMS.get('search', None)
        if search_param is not None:
            """
            set queryset here or use your TownFilter 
            """
        return queryset

另一种方法是在列表api视图类中设置search_fields并组合使用SearchFilter类。问题在于,如果您要对多个模型进行过滤,则可能需要在此处执行一些额外的实施,以确保它能够准确地查看您想要的内容。如果您没有做任何花哨的事情,请为区域添加双下划线,例如:region__name