在我的项目中,我使用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 。我怎么能这样做?
答案 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