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.我怎样才能做到这一点?
有几个选项,但最简单的方法是在 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
| 归档时间: |
|
| 查看次数: |
10802 次 |
| 最近记录: |