django drf (过滤、搜索、排序、分页)
1.过滤
-
参考官网:https://django-filter.readthedocs.io/en/master/guide/install.html
-
在写django drf的时候会遇到搜索,以及过滤的情况。django-filter就可以很好的满足我们。
-
本篇文章写的并不复杂,主要让读者入门,然后阅读官网进阶
-
pip安装
pip install django-filter -
安装完之后,加入到 INSTALLED_APPS
INSTALLED_APPS = [
…
‘django_filters’,
] -
建立一个filter.py文件名字自定义
-
filter.py
import django_filters
from .models import RegistrationManager #RegistrationManager:models数据库class RegistrationManagerFilter(django_filters.FilterSet): # field_name :数据库字段名字 ,lookup_expr:参数 min_date = django_filters.DateFilter(field_name='time', lookup_expr='gte') max_date = django_filters.DateFilter(field_name='time', lookup_expr='lte') #min_date,max_date:时间过滤 class Meta: model = RegistrationManager # fields = '__all__' fields = ['id', 'department', 'doctor', 'min_date', 'max_date'] models:指定数据库 fields:指定数据库的字段名
-
views.py
from rest_framework.viewsets import ModelViewSet
from django_filters.rest_framework import DjangoFilterBackend
from django_filters import rest_framework
from .filter import RegistrationManagerFilter#自己创的文件class RegistrationManagerView(ModelViewSet): queryset = RegistrationManager.objects.all().order_by() serializer_class = RegistrationManagerSerializer filter_backends = (rest_framework.DjangoFilterBackend, ) filter_class = RegistrationManagerFilter #添加filter_backends并设置 #并且把filter的class加入到filter_calss就可以了
-
运行结果
2.搜索,过滤
-
和过滤一样,下载django-filter并加入到INSTALLED_APPS中
-
接续编写views.py
from rest_framework.viewsets import ModelViewSet
from django_filters.rest_framework import DjangoFilterBackend
from django_filters import rest_framework
from .filter import RegistrationManagerFilter#自己创的文件class RegistrationManagerView(ModelViewSet): queryset = RegistrationManager.objects.all().order_by() serializer_class = RegistrationManagerSerializer filter_backends = (rest_framework.DjangoFilterBackend, filters.SearchFilter,filters.OrderingFilter,) filter_class = RegistrationManagerFilter search_fields = ('name', 'id', 'department__patient_name', 'doctor__username') ordering_fields = ('name', 'first_visit', 'state', 'id') #如果有外键,在search_fields中加入一个外键的名字是不能查询的,要写成(外键名__外键中的字段名) #和过滤不一样的是,需要加入filters.SearchFilter,filters.OrderingFilter #filters.SearchFilter:用于搜索 #filters.OrderingFilter:用于排序 #ordering_fields:可以设置排序方式 #当然搜索也可以进行设置 #‘^’:以 xx 字符串开始 #‘=’:完全匹配 #‘@’:全文搜索(目前只支持Django的MySQL后端) #$表示以什么结尾 #‘$’:正则表达式搜索
-
搜索的时候,经常会遇到外键,表之间的关系所以需要简单的处理一下,如果有外键,在search_fields中加入一个外键的名字是不能查询的,要写成(外键名__外键中的字段名)
-
效果图
3.接写来就是分页啦
- 分页还是很简单的
- 在setting.py加入以下代码即可
REST_FRAMEWORK = {
‘DEFAULT_PAGINATION_CLASS’: ‘rest_framework.pagination.PageNumberPagination’,
‘PAGE_SIZE’: 100 # 每页数目
}
还可以自定义传统分页类 - 重写 PageNumberPagination,不过现在还没用到就先不写了