Djangorestframework(实战篇)------过滤、搜索、排序、分页Django restframework(实战篇)------过滤、搜索、排序、分页本⽂转载⾃
⼀、过滤
官⽅API向导:
django-filter 库包括⼀个DjangoFilterBackend类,它⽀持REST框架的⾼度可定制的字段过滤。
⾸先安装 django-filter ,然后将 django_filters 添加到Django的 INSTALLED_APPS 。
在 加上如下配置:
REST_FRAMEWORK ={
'DEFAULT_FIlter_BACKENDS':('st_framework.DjangoFilterBackend',)
}
或者将过滤器加到单个 View 或 ViewSet 中(⼀般使⽤这种):
from st_framework import DjangoFilterBackend
class UrListView(mixins.ListModelMixin, viewts.GenericViewSet):
...
filter_backends =(DjangoFilterBackend,)
如果要允许对某些字段进⾏过滤,可以使⽤ filter_fields 属性。
class ProductList(mixins.ListModelMixin, viewts.GenericViewSet):
queryt = Product.objects.all()
rializer_class = ProductSerializer
filter_backends =(DjangoFilterBackend,)
张亚光filter_fields =('category','in_stock')
还可以⾃定义过滤类,再⽤ filter_class 指定过滤集合类
import django_filters
dels import Product发奶鲫鱼汤
from myapp.rializers import ProductSerializer
from rest_framework import filters
from rest_framework import generics
class ProductFilter(filters.FilterSet):
min_price = django_filters.NumberFilter(name='price', lookup_type='gte')
max_price = django_filters.NumberFilter(name='price', lookup_type='lte')
计算机课>转辙器# ⾏为:名称中包含某字符,且字符不区分⼤⼩写
name = filters.CharFilter(name='name', lookup_expr='icontains')
class Meta:
model = Product
fields =['category', in_stock', 'min_price', 'max_price']
class ProductList(mixins.ListModelMixin, viewts.GenericViewSet):
queryt = Product.objects.all()
七彩童话rializer_class = ProductSerializer
filter_backends =(filter.DjangoFilterBackend,)
filter_class = ProductFilter
⾃定义查询(模糊查询)
通常我们会⽤到过滤两个时间段内的⼀些数据,当我们⽤django rest framework的时候,它可以根据字段filter_fields进⾏过滤,但是对于⽇期来说并不起作⽤,这个时候就需要我们设置重写 queryt ⽅法进⾏捕捉了:
def get_queryt(lf):
start = lf.request.('start_time',None)
end = lf.request.('end_time',None)
if start and stop:
return Students.objects.filter(crated_time__gte=start).filter(created_time__lte=end)
return Students.objects.all()
def get_queryt(lf):
"""
⾃定义get_queryt⽅法,⽤来条件查询queryt
:return:
"""
query_t = lf.queryt
record_no = lf.request.('record_no', None)
if record_no: # 对于病历号的模糊查询
id_list = Registration.objects.values_list('id')
id_list =list(id_list)
new_list =list()
if id_list:
new_list =[str(i[0])for i in id_list if record_no in str(i[0])]
query_t = Registration.objects.filter(id__in=new_list)
doctor = lf.request.('doctor', None)
if doctor: # 对于主治医⽣的模糊查询
query_t = query_t.filter(doctor__real_name__icontains=doctor)
department = lf.request.('department', None)
if department: # 对于门诊科室的模糊查询
query_t = query_t.filter(department__department_name__icontains=department)
start = lf.request.('start_time', None)
end = lf.request.('end_time', None)
if start and end: # 对于挂号时间的模糊查询
query_t = query_t.filter(regist_date__gte=start).filter(regist_date__lte=end)
return query_t
⼆、搜索
官⽅API向导:
如果要明确指定可以对哪些字段进⾏搜索,可以使⽤ arch_fields 属性,默认为可以对 rializer_class 属性指定的串⾏器上的任何可读字段进⾏搜索:
from rest_framework.filters import SearchFilter
class UrListView(mixins.ListModelMixin, viewts.GenericViewSet):
queryt = Ur.objects.all()
rializer_class = UrSerializer
filter_backends =(SearchFilter,)
arch_fields =('urname','email')
也可以使⽤双下划线在 Foreign Key 或 ManyToManyField 上执⾏相关查找:
元宵节的历史arch_fields =('urname','email','profile__profession')
默认情况下,搜索将使⽤不区分⼤⼩写的部分匹配。搜索参数可以包含多个搜索项,它们应该是空格和/或逗号分隔。如果使⽤多个搜索项,则仅当所有提供的条款匹配时,才会在列表中返回对象。默认情况下,搜索参数被命名为“arch”,但这可能会被
SEARCH_PARAM 设置覆盖。
The arch behavior may be restricted by prepending various characters to the arch_fields。
可以通过在 arch_fields 中加⼊⼀些字符来限制搜索⾏为,如下:
‘^’:以 xx 字符串开始搜索
‘=’:完全匹配
‘@’:全⽂搜索(⽬前只⽀持Django的MySQL后端)
世界上活了一亿岁的人
‘$’:正则表达式搜索
三、排序
官⽅API向导:
OrderingFilter 类⽀持简单的查询参数控制结果排序。
默认情况下,查询参数被命名为“ordering”,但这可能会被ORDERING_PARAM设置覆盖。
可以使⽤ ordering_fields 属性明确指定可以对哪些字段执⾏排序,这有助于防⽌意外的数据泄露,例如允许⽤户对密码散列字段或其他敏感数据进⾏排序。
四大洋的位置如果不指定ordering_fields属性,则默认为可以对 rializer_class 属性指定的串⾏器上的任何可读字段进⾏过滤。
from rest_framework.filters import OrderingFilter
class UrListView(generic.ListAPIView):
queryt = Ur.objects.all()
rializer_class = UrSerializer
filter_backends =(OrderingFilter,)
ordering_fields =('urname','email')
使⽤ ordering 属性设置默认排序:
ordering = ('urname',)
四、分页
可以直接在 中⾃定义分页规则
from rest_framework.pagination import PageNumberPagination
class StandartResultsSetPagination(PageNumberPagination):
"""
配置分页规则
"""
page_size =12
page_size_query_param ='page_size'
page_query_param ='page'
max_page_size =100
应⽤到视图函数中:
class GoodsListViewSet(mixinx.ListModelMixin, viewts.GenericViewSet):
pagination_class = StandartResultsSetPagination
PageNumberPagination:此分页样式在请求查询参数中接收单个编号页⾯。
全局设置
REST_FRAMEWORK ={
'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination'
}
PageNumberPagination类包括可以覆盖以修改分页样式的许多属性,要设置这些属性,应覆盖PageNumberPagination类,然后如上所⽰启⽤⾃定义分页类。
django_paginator_class:使⽤的Django Paginator类,默认是paginator.Paginator,对⼤部分⽤例是适⽤的。
page_size:数值,页⾯⼤⼩,默认是全局PAGE_SIZE的值。
page_query_param:字符串,查询参数的名称,默认是’page’。
page_size_query_param:字符串,请求设置页⾯⼤⼩的参数名称,默认是None,表⽰客户端可能⽆法控制请求的页⾯⼤⼩。
max_page_size:字符串,最⼤允许请求的页⾯⼤⼩,此属性仅在page_size_query_param也被设置时有效。
last_page_strings:字符串列表或者元组,默认是(‘last’,)
template:分页控件使⽤的模板的名称,可以覆盖或设置为None,默认为"rest_framework/pagination/numbers.html"
LimitOfftPagination:查找多个数据库记录时使⽤的语法,客户端包括“limit”和“offt”查询参数, limit 指⽰要返回的最⼤项⽬数,并且相当于其他样式中的 page_size, offt 表⽰查询起始位置。
全局设置
REST_FRAMEWORK ={
'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.LimitOfftPagination'
}
本⽂转载⾃