国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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(系統(tǒng)&開發(fā)) Python

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

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

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

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

實現(xiàn)model

1.在這個示例項目中,需要實現(xiàn)對物理服務器的條件過濾,物理服務器的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'狀態(tài)', max_length=16, choices=status_choice)
 
  created_time = models.datetimefield(verbose_name=u'創(chuàng)建時間', 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

實現(xiàn)serializer

接下來需要實現(xiàn)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外,序列化還可以指定其他的信息,比如嵌套信息或者自定義的信息。具體可以取決于業(yè)務邏輯。

實現(xiàn)modelviewset

對于modelviewset,我們可以圍繞它對用戶請求做相應的處理。常見的是對model進行增加、刪除、查找、修改等。在這部分我們需要實現(xiàn)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指定返回列表的形式,所有的信息都返回,并且按照創(chuàng)建時間逆序排列,這樣可以把最新的信息先返回,比較符合用戶的操作習慣。

serializer_class定義了返回的序列化格式為serverserializer所指定的fields內容

pagination_class 指定了分頁的類型,這個myformatresultssetpagination是我們的自定義類型

實現(xiàn)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 數據的查找、過濾、排序的示例

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

按照條件獲取

在日常操作中,我們需要獲取指定條件的數據,例如對于物理服務器,我們需要指定品牌、指定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字段指定了默認排序方式(按照創(chuàng)建時間逆序排序):

?
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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产第一区在线观看 | 日韩不卡 | 国产高清在线精品 | 国产在线一区二区 | 中文字幕一区二区三区四区不卡 | 国产乱码精品一区二区三区五月婷 | 国产精品久久久久久久一区探花 | 国产精品久久久久永久免费观看 | 欧美精品一区二区三区蜜桃视频 | 免费黄色在线 | 亚洲欧美激情精品一区二区 | 久久亚洲欧美日韩精品专区 | 一区二区三区免费在线观看 | 韩日毛片 | 亚洲电影天堂在线观看 | 亚洲人一区二区 | 精品视频在线播放 | 在线观看91视频 | 免费一看一级毛片 | 色网站在线 | 成人免费网站在线观看 | 亚洲视频播放 | 欧美亚洲第一页 | 午夜大片网 | 国产一在线 | 久草热8精品视频在线观看 毛片黄片免费观看 | 日韩视频精品 | 中文字幕亚洲欧美日韩在线不卡 | 一区二区三区久久久久 | 中文字幕国产 | 91人人爽人人爽人人精88v | 午夜大片男女免费观看爽爽爽尤物 | 亚洲一区中文字幕在线观看 | 欧美伦理一区二区 | 亚洲欧美一级 | 成人在线观 | av免费观看网站 | 国产免费性| 国产成人精品一区二区三区视频 | 国产综合久久 | 国产高潮久久 |