django-rest-framework实现数据的过滤、搜索、排序
过滤(1)如果进行条件过滤,需要首先安装django-filter模块:pip install django-filter(2)在配置文件settings.py中添加应用django_filters:INSTALLED_APPS = [......'apps.assets.apps.AssetsConfig',"rest_framework","django_filters",](3)在apps/
-
过滤
(1)如果进行条件过滤,需要首先安装django-filter模块:
pip install django-filter
(2)在配置文件settings.py中添加应用django_filters:
INSTALLED_APPS = [
......
'apps.assets.apps.AssetsConfig',
"rest_framework",
"django_filters",
]
(3)在apps/assets/views.py导入包:
from rest_framework import filters
from django_filters import rest_framework
from .filters import ServerFilter
(4)ServerViewSet添加相应的过滤条件如下:
class ServerViewSet(viewsets.ModelViewSet):
queryset = Server.objects.all()
serializer_class = ServerSerializer
pagination_class = PageNumberPagination
pagination_class.page_size = 2
# 过滤、搜索、排序
# 这里的filter_backends指定了过滤的类型,此处设定了DjangoFilterBackend(过滤)、
# SearchFilter(搜索)和OrderingFIlter(排序)。
filter_backends = [rest_framework.DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
filterset_class = ServerFilter
# server_name模糊搜索,=brand精确匹配, status必须输入原值:online/offline,而不能输入上线/下线
search_fields = ["server_name", "=brand", "status"]
ordering_fields = ["cpus", "ram", "disk", "product_date"]
ordering = ["-created_time"]
(5)过滤设定了过滤的配置类为ServerFilter,关于ServerFilter在apps/assets/filters.py文件中进行了定义:
import django_filters
from .models import Server
from django_filters import FilterSet
class ServerFilter(FilterSet):
server_name = django_filters.CharFilter(field_name='server_name', lookup_expr='icontains')
brand = django_filters.CharFilter(field_name='brand', lookup_expr='icontains')
cpus = django_filters.NumberFilter(field_name='cpus')
ram = django_filters.NumberFilter(field_name='ram')
disk = django_filters.NumberFilter(field_name="disk")
class Meta:
model = Server
fields = ['server_name', 'brand', 'cpus', 'ram', 'disk', ]
(6)也就是说可以通过’server_name’, ‘brand’, ‘cpus’, ‘ram’, ‘disk’对物理服务器的信息进行过滤,得到相应的序列化列表
例如获取cpu为2核、内存ram为4g的屋里服务器
得到物理服务器列表中cpu都为2,内存都为4
HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"id": 4,
"server_name": "服务器3",
"server_num": "004",
"brand": "乌班图品牌",
"model": "dddd",
"cpus": 2,
"ram": 4,
"disk": 800,
"product_date": "2020-12-29T14:30:20.953199",
"status": "online",
"created_time": "2020-12-29T14:30:20.953199",
"modified_time": "2020-12-29T14:30:20.953199"
},
{
"id": 2,
"server_name": "windows",
"server_num": "002",
"brand": "windows服务器",
"model": "aabbcc",
"cpus": 2,
"ram": 4,
"disk": 1000,
"product_date": "2020-12-29T13:58:29.152850",
"status": "online",
"created_time": "2020-12-29T13:58:29.152850",
"modified_time": "2020-12-29T13:58:29.152850"
}
]
}
2. 搜索
(1)搜索需要指定search关键字需要查询的信息,例如搜索名称包含"test"的服务器:
http://127.0.0.1:8000/assets/servers/?search=test
(2)获取结果:
HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"id": 4,
"server_name": "01-test-服务器",
"server_num": "004",
"brand": "乌班图品牌",
"model": "dddd",
"cpus": 2,
"ram": 4,
"disk": 800,
"product_date": "2020-12-29T14:30:20.953199",
"status": "online",
"created_time": "2020-12-29T14:30:20.953199",
"modified_time": "2020-12-29T14:30:20.953199"
},
{
"id": 3,
"server_name": "01-test-服务器",
"server_num": "003",
"brand": "联想品牌",
"model": "qqqq",
"cpus": 1,
"ram": 4,
"disk": 250,
"product_date": "2020-12-29T13:59:31.192399",
"status": "online",
"created_time": "2020-12-29T13:59:31.192399",
"modified_time": "2020-12-29T13:59:31.192399"
}
]
}
(3)在search_fields中可以指定多种查找方式:
‘^name’ 以name开头
‘=name’ 精确匹配
‘@’ 全局检索(只有mysql数据源支持)
‘$’ 正则匹配
对应的search_fileds示例如下:
search_fields = ["^server_name", "=brand", "status"]
3. 排序
(1)在ordering字段指定了默认排序方式(按照创建时间逆序排序):
ordering = ["-created_time"]
(2)也可以使用如下方式指定:
queryset = Server.objects.all().order_by('-created_time')
(3)如果要自定义排序字段,需要指定ordering字段的内容:
ordering_fields = ["cpus", "ram", "disk", "product_date"]
例如按照磁盘大小降序排列服务器:
http://127.0.0.1:8000/assets/servers/?ordering=-disk
(4)结果如下:
HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
{
"count": 4,
"next": "http://127.0.0.1:8000/assets/servers/?ordering=-disk&page=2",
"previous": null,
"results": [
{
"id": 2,
"server_name": "windows",
"server_num": "002",
"brand": "windows服务器",
"model": "aabbcc",
"cpus": 2,
"ram": 4,
"disk": 1000,
"product_date": "2020-12-29T13:58:29.152850",
"status": "online",
"created_time": "2020-12-29T13:58:29.152850",
"modified_time": "2020-12-29T13:58:29.152850"
},
{
"id": 4,
"server_name": "01-test-服务器",
"server_num": "004",
"brand": "乌班图品牌",
"model": "dddd",
"cpus": 2,
"ram": 4,
"disk": 800,
"product_date": "2020-12-29T14:30:20.953199",
"status": "online",
"created_time": "2020-12-29T14:30:20.953199",
"modified_time": "2020-12-29T14:30:20.953199"
}
]
}
结论:本章内容介绍了django rest framework中过滤、搜索、排序等功能,是书写后端接口必须掌握的技巧
更多推荐
所有评论(0)