django rest framework 数据的查找、过滤、排序的示例
作者:linux_player_c(系统&开发) 发布时间:2023-07-18 16:33:39
对于管理系统,常常需要展示列表数据,我们对于列表内的数据常常需要查找、过滤、排序等操作,其中查找等操作大部分是在后台进行的。django rest framework可以轻松的实现数据的查找、过滤等操作。接下来我们将以实际的例子进行介绍。
示例代码github地址: https://github.com/jinjidejuren/drf_learn
例如cmdb系统,作为资产管理系统常常需要对数据进行过滤或查找,获取期望的信息。
实现model
1.在这个示例项目中,需要实现对物理服务器的条件过滤,物理服务器的model列表如下(apps/assets/models.py文件):
class Server(models.Model):
"""
物理服务器
"""
status_choice = (
('online', '上线'),
('offline', '下线'),
('normal', '正常'),
('abnormal', '异常')
)
server_name = models.CharField(verbose_name=u'服务器名称', max_length=128, blank=False, null=False)
server_num = models.CharField(verbose_name=u'服务器编号', max_length=128, blank=True, null=True)
brand = models.CharField(verbose_name=u'品牌', max_length=64, blank=True, null=True)
model = models.CharField(verbose_name=u'型号', max_length=64, blank=True, null=True)
cpus = models.IntegerField(verbose_name=u'cpu核数', default=0)
ram = models.IntegerField(verbose_name=u'内存大小', default=0)
disk = models.IntegerField(verbose_name=u'磁盘大小', default=0)
product_date = models.DateTimeField(verbose_name=u'生产日期', auto_now_add=True)
status = models.CharField(verbose_name=u'状态', max_length=16, choices=status_choice)
created_time = models.DateTimeField(verbose_name=u'创建时间', auto_now_add=True)
modified_time = models.DateTimeField(verbose_name=u'修改时间', auto_now_add=True)
class Meta:
verbose_name = u'服务器'
verbose_name_plural = verbose_name
def __str__(self):
return self.server_name
实现serializer
接下来需要实现server这个model的序列化类,在apps/assets/serializers.py中编写:
class ServiceSerializer(serializers.ModelSerializer):
"""
服务器序列化
"""
class Meta:
model = Server
fields = ('id', 'server_name', 'server_num', 'brand', 'model', 'cpus',
'ram', 'disk', 'product_date', 'status', 'created_time',
'modified_time')
对于fields来说,可以使用 _ all _ 来代表所有的字段,除了model中定义的field外,序列化还可以指定其他的信息,比如嵌套信息或者自定义的信息。具体可以取决于业务逻辑。
实现modelviewset
对于modelviewset,我们可以围绕它对用户请求做相应的处理。常见的是对model进行增加、删除、查找、修改等。在这部分我们需要实现ServerViewSet:
class ServerViewSet(viewsets.ModelViewSet):
"""
物理服务器视图
"""
queryset = Server.objects.all().order_by('-created_time')
serializer_class = ServerSerializer
pagination_class = MyFormatResultsSetPagination
queryset指定返回列表的形式,所有的信息都返回,并且按照创建时间逆序排列,这样可以把最新的信息先返回,比较符合用户的操作习惯。
serializer_class定义了返回的序列化格式为ServerSerializer所指定的fields内容
pagination_class 指定了分页的类型,这个MyFormatResultsSetPagination是我们的自定义类型
实现router
如果用户想要访问server的信息,需要指定server的路由,这个和之前介绍的类似。需要的嗯一个一个router对象,并且将server的路由注册进去。
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'servers', views.ServerViewSet, base_name='servers')
urlpatterns = [
url(r'^', include(router.urls))
]
对于servers的访问都由ServerViewSet进行处理。
尝试访问
http://127.0.0.1:8060/assets/v1/servers/ ,信息如下:
注:我们需要添加示例信息,作为后续的各种测试使用。
按照条件获取
在日常操作中,我们需要获取指定条件的数据,例如对于物理服务器,我们需要指定品牌、指定cpu核数、指定内存大小等。有时候我们需要按照cpu核数进行排序。这些都需要我们对ServerViewSet进行更多的拓展。
如果进行条件过滤,需要首先安装django-filter模块:
pip install django-filter
在配置文件settings/base.py中添加应用django_filters:
INSTALLED_APPS = [
# 'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'django_filters',
'apps.assets',
'apps.rbac'
]
在apps/assets/views.py顶部包含如下包:
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters
from django_filters import rest_framework
ServerViewSet可以添加相应的过滤条件:
class ServerViewSet(viewsets.ModelViewSet):
"""
物理服务器视图
"""
queryset = Server.objects.all()
serializer_class = ServerSerializer
pagination_class = MyFormatResultsSetPagination
filter_backends = (rest_framework.DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter, )
filter_class = ServerFilter
search_fields = ('server_name', '=brand', 'status', )
ordering_fields = ('cpus', 'ram', 'disk', 'product_date', )
ordering = ('-created_time', )
这里的filter_backends指定了过滤的类型,此处设定了DjangoFilterBackend(过滤)、SearchFilter(搜索)和OrderingFIlter(排序)。
1.过滤
过滤设定了过滤的配置类为ServerFilter,关于ServerFilter在apps/assets/filters.py文件中进行了定义:
import django_filters
from .models import *
class ServerFilter(django_filters.rest_framework.FilterSet):
"""
物理服务器过滤器
"""
server_name = django_filters.CharFilter(name='server_name', lookup_expr='icontains')
brand = django_filters.CharFilter(name='brand', lookup_expr='icontains')
cpus = django_filters.NumberFilter(name='cpus')
ram = django_filters.NumberFilter(name='ram')
disk = django_filters.NumberFilter(name='disk')
class Meta:
model = Server
fields = ['server_name', 'brand', 'cpus', 'ram', 'disk', ]
也就是说可以通过'server_name', ‘brand', ‘cpus', ‘ram', ‘disk'对物理服务器的信息进行过滤,得到相应的序列化列表。
例如获取cpu为24核的物理服务器:
得到物理服务器列表中cpu都为24:
GET /assets/v1/servers/?server_name=&brand=&cpus=24&ram=&disk=
HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
{
"results": [
{
"id": 9,
"server_name": "data-server2",
"server_num": "server-01-shanghai",
"brand": "hp",
"model": "HPE Apollo 4200 Gen9",
"cpus": 24,
"ram": 64,
"disk": 2500,
"product_date": "2018-06-23T13:51:09.641473Z",
"status": "online",
"created_time": "2018-06-23T13:51:09.642583Z",
"modified_time": "2018-06-23T13:51:09.642764Z"
},
{
"id": 8,
"server_name": "data-server2",
"server_num": "server-01-shanghai",
"brand": "hp",
"model": "HPE Apollo 4200 Gen9",
"cpus": 24,
"ram": 64,
"disk": 5000,
"product_date": "2018-06-23T13:51:02.466031Z",
"status": "online",
"created_time": "2018-06-23T13:51:02.467274Z",
"modified_time": "2018-06-23T13:51:02.467471Z"
},
{
"id": 7,
"server_name": "data-server1",
"server_num": "server-01-shanghai",
"brand": "hp",
"model": "HPE Apollo 4200 Gen9",
"cpus": 24,
"ram": 64,
"disk": 5000,
"product_date": "2018-06-23T13:50:55.622403Z",
"status": "offline",
"created_time": "2018-06-23T13:50:55.623315Z",
"modified_time": "2018-06-23T13:50:55.623431Z"
},
{
"id": 6,
"server_name": "data-server",
"server_num": "server-01-shanghai",
"brand": "hp",
"model": "HPE Apollo 4200 Gen9",
"cpus": 24,
"ram": 64,
"disk": 5000,
"product_date": "2018-06-23T13:50:48.088028Z",
"status": "online",
"created_time": "2018-06-23T13:50:48.089433Z",
"modified_time": "2018-06-23T13:50:48.089703Z"
},
{
"id": 5,
"server_name": "harbor-server3",
"server_num": "server-01-beijing",
"brand": "dell",
"model": "Rack",
"cpus": 24,
"ram": 128,
"disk": 5000,
"product_date": "2018-06-23T13:49:27.590015Z",
"status": "offline",
"created_time": "2018-06-23T13:49:27.590980Z",
"modified_time": "2018-06-23T13:49:27.591097Z"
},
{
"id": 4,
"server_name": "harbor-server3",
"server_num": "server-01-beijing",
"brand": "dell",
"model": "Rack",
"cpus": 24,
"ram": 128,
"disk": 5000,
"product_date": "2018-06-23T13:49:23.783337Z",
"status": "abnormal",
"created_time": "2018-06-23T13:49:23.784243Z",
"modified_time": "2018-06-23T13:49:23.784500Z"
},
{
"id": 3,
"server_name": "harbor-server2",
"server_num": "server-01-beijing",
"brand": "dell",
"model": "Rack",
"cpus": 24,
"ram": 128,
"disk": 5000,
"product_date": "2018-06-23T13:49:16.348672Z",
"status": "online",
"created_time": "2018-06-23T13:49:16.349555Z",
"modified_time": "2018-06-23T13:49:16.349663Z"
},
{
"id": 2,
"server_name": "harbor-server1",
"server_num": "server-02-beijing",
"brand": "dell",
"model": "Rack",
"cpus": 24,
"ram": 128,
"disk": 5000,
"product_date": "2018-06-23T13:48:57.853354Z",
"status": "online",
"created_time": "2018-06-23T13:48:57.853990Z",
"modified_time": "2018-06-23T13:48:57.854098Z"
},
{
"id": 1,
"server_name": "harbor-server",
"server_num": "server-01-beijing",
"brand": "dell",
"model": "Rack",
"cpus": 24,
"ram": 128,
"disk": 5000,
"product_date": "2018-06-23T13:48:48.777153Z",
"status": "online",
"created_time": "2018-06-23T13:48:48.778048Z",
"modified_time": "2018-06-23T13:48:48.778166Z"
}
],
"pagination": 9,
"page_size": 10,
"page": 1
}
2.搜索
搜索需要指定 search 关键字需要查询的信息,例如搜索名称为‘test'开头的服务器:
http://127.0.0.1:8060/assets/v1/servers/?search=test
获取列表:
HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
{
"results": [
{
"id": 14,
"server_name": "test-server1",
"server_num": "server-01-shanghai",
"brand": "dell",
"model": "Modular",
"cpus": 32,
"ram": 256,
"disk": 500,
"product_date": "2018-06-23T13:52:40.583743Z",
"status": "offline",
"created_time": "2018-06-23T13:52:40.584409Z",
"modified_time": "2018-06-23T13:52:40.584512Z"
},
{
"id": 13,
"server_name": "test-server",
"server_num": "server-01-shanghai",
"brand": "dell",
"model": "Modular",
"cpus": 32,
"ram": 256,
"disk": 2500,
"product_date": "2018-06-23T13:52:24.760819Z",
"status": "normal",
"created_time": "2018-06-23T13:52:24.761475Z",
"modified_time": "2018-06-23T13:52:24.761578Z"
}
],
"pagination": 2,
"page_size": 10,
"page": 1
}
在search_fields中可以指定多种查找方式:
‘^name' 以name开头
‘=name' 精确匹配
‘@' 全局检索(只有mysql数据源支持)
‘$' 正则匹配
对应的search_fileds示例如下:
search_fields = ('^server_name', '=brand', 'status', )
3.排序
在ordering字段指定了默认排序方式(按照创建时间逆序排序):
ordering = ('-created_time', )
也可以使用如下方式指定:
queryset = Server.objects.all().order_by('-created_time')
如果要自定义排序字段,需要指定 ordering 字段的内容:
例如按照内存大小排列服务器:
http://127.0.0.1:8060/assets/v1/servers/?ordering=ram
获取的信息列表如下:
HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
{
"results": [
{
"id": 6,
"server_name": "data-server",
"server_num": "server-01-shanghai",
"brand": "hp",
"model": "HPE Apollo 4200 Gen9",
"cpus": 24,
"ram": 64,
"disk": 5000,
"product_date": "2018-06-23T13:50:48.088028Z",
"status": "online",
"created_time": "2018-06-23T13:50:48.089433Z",
"modified_time": "2018-06-23T13:50:48.089703Z"
},
{
"id": 7,
"server_name": "data-server1",
"server_num": "server-01-shanghai",
"brand": "hp",
"model": "HPE Apollo 4200 Gen9",
"cpus": 24,
"ram": 64,
"disk": 5000,
"product_date": "2018-06-23T13:50:55.622403Z",
"status": "offline",
"created_time": "2018-06-23T13:50:55.623315Z",
"modified_time": "2018-06-23T13:50:55.623431Z"
},
{
"id": 8,
"server_name": "data-server2",
"server_num": "server-01-shanghai",
"brand": "hp",
"model": "HPE Apollo 4200 Gen9",
"cpus": 24,
"ram": 64,
"disk": 5000,
"product_date": "2018-06-23T13:51:02.466031Z",
"status": "online",
"created_time": "2018-06-23T13:51:02.467274Z",
"modified_time": "2018-06-23T13:51:02.467471Z"
},
{
"id": 9,
"server_name": "data-server2",
"server_num": "server-01-shanghai",
"brand": "hp",
"model": "HPE Apollo 4200 Gen9",
"cpus": 24,
"ram": 64,
"disk": 2500,
"product_date": "2018-06-23T13:51:09.641473Z",
"status": "online",
"created_time": "2018-06-23T13:51:09.642583Z",
"modified_time": "2018-06-23T13:51:09.642764Z"
},
{
"id": 1,
"server_name": "harbor-server",
"server_num": "server-01-beijing",
"brand": "dell",
"model": "Rack",
"cpus": 24,
"ram": 128,
"disk": 5000,
"product_date": "2018-06-23T13:48:48.777153Z",
"status": "online",
"created_time": "2018-06-23T13:48:48.778048Z",
"modified_time": "2018-06-23T13:48:48.778166Z"
},
{
"id": 2,
"server_name": "harbor-server1",
"server_num": "server-02-beijing",
"brand": "dell",
"model": "Rack",
"cpus": 24,
"ram": 128,
"disk": 5000,
"product_date": "2018-06-23T13:48:57.853354Z",
"status": "online",
"created_time": "2018-06-23T13:48:57.853990Z",
"modified_time": "2018-06-23T13:48:57.854098Z"
},
{
"id": 3,
"server_name": "harbor-server2",
"server_num": "server-01-beijing",
"brand": "dell",
"model": "Rack",
"cpus": 24,
"ram": 128,
"disk": 5000,
"product_date": "2018-06-23T13:49:16.348672Z",
"status": "online",
"created_time": "2018-06-23T13:49:16.349555Z",
"modified_time": "2018-06-23T13:49:16.349663Z"
},
{
"id": 4,
"server_name": "harbor-server3",
"server_num": "server-01-beijing",
"brand": "dell",
"model": "Rack",
"cpus": 24,
"ram": 128,
"disk": 5000,
"product_date": "2018-06-23T13:49:23.783337Z",
"status": "abnormal",
"created_time": "2018-06-23T13:49:23.784243Z",
"modified_time": "2018-06-23T13:49:23.784500Z"
},
{
"id": 5,
"server_name": "harbor-server3",
"server_num": "server-01-beijing",
"brand": "dell",
"model": "Rack",
"cpus": 24,
"ram": 128,
"disk": 5000,
"product_date": "2018-06-23T13:49:27.590015Z",
"status": "offline",
"created_time": "2018-06-23T13:49:27.590980Z",
"modified_time": "2018-06-23T13:49:27.591097Z"
},
{
"id": 10,
"server_name": "data-server2",
"server_num": "server-01-shanghai",
"brand": "hp",
"model": "HPE Apollo 4200 Gen9",
"cpus": 32,
"ram": 256,
"disk": 2500,
"product_date": "2018-06-23T13:51:30.706187Z",
"status": "online",
"created_time": "2018-06-23T13:51:30.707754Z",
"modified_time": "2018-06-23T13:51:30.707878Z"
}
],
"pagination": 14,
"page_size": 10,
"page": 1
}
上述的排序、过滤等操作可以组合使用,一般为前端的列表搜索查询提供接口支持。
小结
本章小结的内容介绍了django rest framework如何进行model的定义、序列化、增删改查以及搜索、排序等功能,是书写后端接口必须掌握的技巧。
来源:https://blog.csdn.net/linux_player_c/article/details/80779059
猜你喜欢
- 上一篇相关文章:段正淳的css笔记(2)圆角的做法 1、标题右侧“更多”的实现曾经做上图所示的效果,会使用到position来相对定位到h2
- 我们昨天已经学习了python的文件读写,今天来做一个最简单的例子,写一个最简单的缓存系统,要求:以key``value的方式保持数据,并且
- window.onload=function() {&
- 本文实例讲述了python单向链表的基本实现与使用方法。分享给大家供大家参考,具体如下:# -*- coding:utf-8 -*-#! p
- 前言作为Web开发人员,在 Web浏览器中存储数据以改善用户体验和提升Web应用程序性能是非常常见的。在大多数情况下,可供我们使用就是Loc
- 本文实例讲述了Python装饰器用法。分享给大家供大家参考,具体如下:无参数的装饰器#coding=utf-8def log(func):
- 本文实例讲述了thinkPHP框架通过Redis实现增删改查操作的方法。分享给大家供大家参考,具体如下:一、概述Redis是一个NoSQL数
- 如果网站只开了80端口,你会发现下面的方法是比较有用的,其中用的方法几乎都不是我发现的,文总包括一些注入时的个人经验和技巧方法可以说有4种(
- 如下所示:import tensorflow as tfsess = tf.Session(config=tf.ConfigProto(lo
- 某些情况下:我们希望在一个SQL Server下访问另一个sqlserver数据库上的数据,或者访问其他oracle数据库上的数据,要想完成
- 今天终于可以用wxPython开发GUI程序了,非常高兴。把其中的一些注意点写下来以供参考。在windows XP平台下,首先需要做以下环境
- 这篇论坛文章着重介绍了SQL Server数据库简体繁体数据混用的问题,详细内容请参考下文:我现在要说的是一个在简体繁体数据混用的时候很容易
- 学习前言我发现不仅有很多的Keras模型,还有很多的PyTorch模型,还是学学Pytorch吧,我也想了解以下tensor到底是个啥。Py
- 讲这个方法之前,我们应该先了解下插入节点时浏览器会做什么。在浏览器中,我们一旦把节点添加到document.body(或者其他节点)中,页面
- 数据类型:float — 浮点数可以精确到小数点后面15位int — 整型可以无限 * ool — 非零为true,零为falselist —
- 1、说明拼接文件路径,可以有多个参数。2、语法os.path.join(path1,path2,*)path1 初始路径。path2 需要拼
- javascript模仿alert提示效果,如果你听厌倦了系统自带的那个,可以使用这个alert提示效果,听不错的。相关文章推荐《类似于新浪
- asp分页做为一个经典的asp问题,有着非常丰富的分页形式和分页方法,但是大多数的asp分页都是使用VBscript作为服务器端的脚本,本文
- 前几天,看到有人写了个superLink的东东,主要的做什么用呢?我们有时会给在大块元素加个window.location='htt
- 对图片进行resize、裁剪、旋转、翻转图片处理时常用的手段有resize、裁剪、旋转、翻转,简单介绍一下python中怎么利用PIL库和t