一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - django rest framework 數據的查找、過濾、排序的示例

django rest framework 數據的查找、過濾、排序的示例

2021-03-09 00:12linux_player_c(系統&開發) Python

這篇文章主要介紹了 django rest framework 數據的查找、過濾、排序,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

對于管理系統,常常需要展示列表數據,我們對于列表內的數據常常需要查找、過濾、排序等操作,其中查找等操作大部分是在后臺進行的。django rest framework可以輕松的實現數據的查找、過濾等操作。接下來我們將以實際的例子進行介紹。

示例代碼github地址:https://github.com/jinjidejuren/drf_learn

例如cmdb系統,作為資產管理系統常常需要對數據進行過濾或查找,獲取期望的信息。

實現model

1.在這個示例項目中,需要實現對物理服務器的條件過濾,物理服務器的model列表如下(apps/assets/models.py文件):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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中編寫:

?
1
2
3
4
5
6
7
8
9
10
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:

?
1
2
3
4
5
6
7
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的路由注冊進去。

?
1
2
3
4
5
6
7
8
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/ ,信息如下:

django rest framework 數據的查找、過濾、排序的示例

注:我們需要添加示例信息,作為后續的各種測試使用。

按照條件獲取

在日常操作中,我們需要獲取指定條件的數據,例如對于物理服務器,我們需要指定品牌、指定cpu核數、指定內存大小等。有時候我們需要按照cpu核數進行排序。這些都需要我們對serverviewset進行更多的拓展。

如果進行條件過濾,需要首先安裝django-filter模塊:

?
1
pip install django-filter

在配置文件settings/base.py中添加應用django_filters:

?
1
2
3
4
5
6
7
8
9
10
11
12
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頂部包含如下包:

?
1
2
3
from django_filters.rest_framework import djangofilterbackend
from rest_framework import filters
from django_filters import rest_framework

serverviewset可以添加相應的過濾條件:

?
1
2
3
4
5
6
7
8
9
10
11
12
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文件中進行了定義:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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核的物理服務器:

django rest framework 數據的查找、過濾、排序的示例

得到物理服務器列表中cpu都為24:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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

獲取列表:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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示例如下:

?
1
search_fields = ('^server_name', '=brand', 'status', )

3.排序

在ordering字段指定了默認排序方式(按照創建時間逆序排序):

?
1
ordering = ('-created_time', )

也可以使用如下方式指定:

?
1
queryset = server.objects.all().order_by('-created_time')

如果要自定義排序字段,需要指定 ordering 字段的內容:

例如按照內存大小排列服務器:

http://127.0.0.1:8060/assets/v1/servers/?ordering=ram

獲取的信息列表如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产 日韩欧美 | 国产午夜亚洲精品不卡 | 99热在这里只有精品 | 久久re视频这里精品一本到99 | 亚洲成色WWW久久网站夜月 | 国产精品免费视频一区一 | 精品国产线拍大陆久久尤物 | 成人免费国产欧美日韩你懂的 | 日韩永久在线观看免费视频 | 亚洲成人综合在线 | 日韩精品在线一区二区 | 日本一区二区高清免费不卡 | 884aa在线看片| 日韩二三区| 精品一区heyzo在线播放 | 亚洲高清国产拍精品影院 | 国产精品视频视频久久 | 极品 女神校花 露脸91 | 日本一区二区三区在线 观看网站 | 嗯啊好爽视频 | 精品视频中文字幕 | 97精品国产自在现线免费 | 成人福利免费在线观看 | 无码任你躁久久久久久久 | 久久99精品国产自在自线 | 天天狠天天透天干天天怕处 | 国产欧美视频一区二区三区 | 美琪美腿白丝交小说 | 三级理论在线播放大全 | 男女xxoo做爰猛烈动态一 | 黄动漫软件车车好快的车车 | 欧美爽妇 | 天天色综合色 | 羞羞影院午夜男女爽爽影院网站 | 日韩免费视频一区 | 国产男女乱淫真视频全程播放 | 国产美女在线一区二区三区 | 久久伊人电影 | 99er在线观看| 无人影院在线播放 | 久久久无码精品无码国产人妻丝瓜 |