1 过滤
只针对于 查询所有接口
必须继承 GenericAPIView
# 安装:
pip install django==3.2.12
pip install django-filter
# 使用方式:三种
-方式一:内置的
# 查询方式http://127.0.0.1:8000/books/?search=29 #模糊匹配: 只要名字中有29或价格中有29都能搜出来
# filter_backends = [SearchFilter, OrderingFilter]
# search_fields = ['name', 'price']
-方式二:第三方
# http://127.0.0.1:8000/books/?name=红楼梦
# http://127.0.0.1:8000/books/?price=19&name=西游记
# filter_backends = [DjangoFilterBackend]
# filterset_fields=['name','price']
-方式三:自定义--完全自己控制
# http://127.0.0.1:8000/books/?price=19&name=书
# filter_backends = [MyFilter] # 我自己知道按哪些字段过滤
# 需要写过滤类(下面)
from rest_framework.filters import BaseFilterBackend
from django.db.models import Q
class MyFilter(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
# 基于queryset 进行过滤,过滤后返回即可
# http://127.0.0.1:8000/books/?name=书 # 名字中有书的就查出来
search_param = request.query_params.get('name')
price = request.query_params.get('price')
if search_param and price:
# queryset = queryset.filter(Q(name__contains=search_param) | Q(price=price)) # qs对象的filter
queryset = queryset.filter(name__contains=search_param,price=price) # qs对象的filter
return queryset
1.1 继承APIView写过滤和排序
#### 继承APIView 写过滤,写排序
class BookView(ViewSetMixin, APIView):
def list(self, request, *args, **kwargs):
# 按名字过滤
print('asfdasdf')
name = request.query_params.get('name')
book_list = Book.objects.all().filter(name__contains=name)
ser = BookSerializer(instance=book_list, many=True)
return Response(ser.data)
1.2 继承GenericAPIView写过滤类,可以写多个
写多个,他们是从左往右,依次执行
大原则,配置多个过滤类的时候,第一个放尽量多个过滤掉数据
配置多个:执行原理
-先执行第一个过滤类的:filter_queryset返回qs对象
-再执行第二个过滤类的filter_queryset,传入上一个返回的qs,过滤完返回qs对象
2 分页