过滤django休息框架

Alb*_*kov 7 python django django-filters django-rest-framework

在我的项目中,我使用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')
Run Code Online (Sandbox Code Playgroud)

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']
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

所以,我可以将?region = Region_name&town = Town_name写入请求url的末尾,结果将被过滤.

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

the*_*cks 4

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

适合您的用例的文档示例:

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
Run Code Online (Sandbox Code Playgroud)

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