一、 过滤 Filtering
1.1 内置过滤类的使用SearchFilter
1 在视图类views.py中(必须继承GenericAPIView)
from app01 import models
from app01 import serializer
from rest_framework.viewsets import ModelViewSet
from rest_framework.filters import SearchFilter # 导入内置过滤类
class BookView(ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer
# 配置过滤类(局部使用)
filter_backends = [SearchFilter,]
# 配置过滤字段
search_fields = ['name','price']
2 浏览的地址:
# 查询的时候,所有条件都给search,并支持模糊匹配,search可以是name字段,也可以是price
http://127.0.0.1:8000/book/?search=红精灵
http://127.0.0.1:8000/book/?search=11
3 全局使用:在settings.py配置文件中配置
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.SearchFilter',)
}
1.2 第三方过滤类使用(django-filter)BookModelSerializer
内置的SearchFilter过滤类,功能一般,如果你想实现更高级的过滤,自己写,使用第三方
我们可以通过添加django-fitlter扩展来增强支持。
1 安装(django:2.2, 3.1, 3.2)
pip install django-filter
2 需要注册应用
INSTALLED_APPS = [
...
'django_filters',
]
3 在视图类views.py中(必须继承GenericAPIView)添加filter_fields属性,指定可以过滤的字段
from app01 import models
from app01 import serializer
from rest_framework.viewsets import ModelViewSet
from django_filters.rest_framework import DjangoFilterBackend # 导入第三方过滤类
class BookView(ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer
# 使用第三方
# 配置过滤类(局部使用)
filter_backends=[DjangoFilterBackend,]
# 配置过滤字段
filter_fields=['name','price']
4 浏览的地址:
# 查询可以通过字段查询,但不支持模糊查询
http://127.0.0.1:8000/book/?price=11&name=红精灵
http://127.0.0.1:8000/book/?price=11
5 全局使用:在settings.py配置文件中配置
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
1.3 自定义过滤类(BaseFilterBackend)
1 写一个类,继承第三方过滤类(最好自定义一个py文件,auth.py)
from rest_framework.filters import BaseFilterBackend
class Myfilter(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
name = request.GET.get('name')
queryset = queryset.filter(name__contains=name)
return queryset
2 在视图类views.py中配置
from app01 import models
from app01 import serializer
from rest_framework.viewsets import ModelViewSet
from app01.auth import Myfilter # 导入自定义过滤类
class BookView(ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer
## 自己定义的
filter_backends = [Myfilter