最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

django rest framework 數(shù)據(jù)的查找、過濾、排序的示例

 更新時間:2018年06月25日 08:32:27   作者:linux_player_c(系統(tǒng)&開發(fā))  
這篇文章主要介紹了 django rest framework 數(shù)據(jù)的查找、過濾、排序,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

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

實現(xiàn)model

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

class Server(models.Model):
  """
  物理服務(wù)器
  """
  status_choice = (
    ('online', '上線'),
    ('offline', '下線'),
    ('normal', '正常'),
    ('abnormal', '異常')
  )

  server_name = models.CharField(verbose_name=u'服務(wù)器名稱', max_length=128, blank=False, null=False)
  server_num = models.CharField(verbose_name=u'服務(wù)器編號', 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核數(shù)', default=0)
  ram = models.IntegerField(verbose_name=u'內(nèi)存大小', default=0)
  disk = models.IntegerField(verbose_name=u'磁盤大小', default=0)
  product_date = models.DateTimeField(verbose_name=u'生產(chǎn)日期', 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'服務(wù)器'
    verbose_name_plural = verbose_name

  def __str__(self):
    return self.server_name

實現(xiàn)serializer

接下來需要實現(xiàn)server這個model的序列化類,在apps/assets/serializers.py中編寫:

class ServiceSerializer(serializers.ModelSerializer):
  """
  服務(wù)器序列化
  """

  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è)務(wù)邏輯。

實現(xiàn)modelviewset

對于modelviewset,我們可以圍繞它對用戶請求做相應(yīng)的處理。常見的是對model進(jìn)行增加、刪除、查找、修改等。在這部分我們需要實現(xiàn)ServerViewSet:

class ServerViewSet(viewsets.ModelViewSet):
  """
  物理服務(wù)器視圖
  """
  queryset = Server.objects.all().order_by('-created_time')
  serializer_class = ServerSerializer
  pagination_class = MyFormatResultsSetPagination

queryset指定返回列表的形式,所有的信息都返回,并且按照創(chuàng)建時間逆序排列,這樣可以把最新的信息先返回,比較符合用戶的操作習(xí)慣。

serializer_class定義了返回的序列化格式為ServerSerializer所指定的fields內(nèi)容

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

實現(xiàn)router

如果用戶想要訪問server的信息,需要指定server的路由,這個和之前介紹的類似。需要的嗯一個一個router對象,并且將server的路由注冊進(jìn)去。

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進(jìn)行處理。

嘗試訪問

http://127.0.0.1:8060/assets/v1/servers/ ,信息如下:

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

按照條件獲取

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

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

pip install django-filter

在配置文件settings/base.py中添加應(yīng)用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可以添加相應(yīng)的過濾條件:

class ServerViewSet(viewsets.ModelViewSet):
  """
  物理服務(wù)器視圖
  """
  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指定了過濾的類型,此處設(shè)定了DjangoFilterBackend(過濾)、SearchFilter(搜索)和OrderingFIlter(排序)。

1.過濾

過濾設(shè)定了過濾的配置類為ServerFilter,關(guān)于ServerFilter在apps/assets/filters.py文件中進(jìn)行了定義:

import django_filters

from .models import *


class ServerFilter(django_filters.rest_framework.FilterSet):
  """
  物理服務(wù)器過濾器
  """

  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'對物理服務(wù)器的信息進(jìn)行過濾,得到相應(yīng)的序列化列表。

例如獲取cpu為24核的物理服務(wù)器:

得到物理服務(wù)器列表中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 關(guān)鍵字需要查詢的信息,例如搜索名稱為‘test'開頭的服務(wù)器:

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數(shù)據(jù)源支持)

‘$' 正則匹配

對應(yīng)的search_fileds示例如下:

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

3.排序

在ordering字段指定了默認(rèn)排序方式(按照創(chuàng)建時間逆序排序):

ordering = ('-created_time', )

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

queryset = Server.objects.all().order_by('-created_time')

如果要自定義排序字段,需要指定 ordering 字段的內(nèi)容:

例如按照內(nèi)存大小排列服務(wù)器:

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
}

上述的排序、過濾等操作可以組合使用,一般為前端的列表搜索查詢提供接口支持。

小結(jié)

本章小結(jié)的內(nèi)容介紹了django rest framework如何進(jìn)行model的定義、序列化、增刪改查以及搜索、排序等功能,是書寫后端接口必須掌握的技巧。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python實現(xiàn)替換文件中指定內(nèi)容的方法

    Python實現(xiàn)替換文件中指定內(nèi)容的方法

    這篇文章主要介紹了Python實現(xiàn)替換文件中指定內(nèi)容的方法,涉及Python文件讀寫、字符串替換等相關(guān)操作技巧,需要的朋友可以參考下
    2018-03-03
  • 基于python實現(xiàn)可視化生成二維碼工具

    基于python實現(xiàn)可視化生成二維碼工具

    這篇文章主要介紹了基于python實現(xiàn)可視化生成二維碼工具,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • PyTorch之圖像和Tensor填充的實例

    PyTorch之圖像和Tensor填充的實例

    今天小編就為大家分享一篇PyTorch之圖像和Tensor填充的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python統(tǒng)計學(xué)一數(shù)據(jù)的概括性度量詳解

    Python統(tǒng)計學(xué)一數(shù)據(jù)的概括性度量詳解

    這篇文章主要介紹了Python統(tǒng)計學(xué)一數(shù)據(jù)的概括性度量詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Python開發(fā)寶典CSV JSON數(shù)據(jù)處理技巧詳解

    Python開發(fā)寶典CSV JSON數(shù)據(jù)處理技巧詳解

    在Python中處理CSV和JSON數(shù)據(jù)時,需要深入了解這兩種數(shù)據(jù)格式的讀取、寫入、處理和轉(zhuǎn)換方法,下面將詳細(xì)介紹如何在Python中處理CSV和JSON數(shù)據(jù),并提供一些示例和最佳實踐
    2023-11-11
  • Python和C語言利用棧分別實現(xiàn)進(jìn)制轉(zhuǎn)換

    Python和C語言利用棧分別實現(xiàn)進(jìn)制轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了Python和C語言如何利用棧的數(shù)據(jù)結(jié)構(gòu)分別實現(xiàn)將十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù),文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-07-07
  • Python中獲取圖片的大小問題

    Python中獲取圖片的大小問題

    這篇文章主要介紹了Python中獲取圖片的大小問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Python函數(shù)裝飾器常見使用方法實例詳解

    Python函數(shù)裝飾器常見使用方法實例詳解

    這篇文章主要介紹了Python函數(shù)裝飾器常見使用方法,結(jié)合實例形式分析了Python函數(shù)裝飾器的概念、原理、用法及相關(guān)操作注意事項,需要的朋友可以參考下
    2019-03-03
  • python+mysql實現(xiàn)個人論文管理系統(tǒng)

    python+mysql實現(xiàn)個人論文管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python+mysql實現(xiàn)個人論文管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Pycharm使用爬蟲時遇到etree紅線問題及解決

    Pycharm使用爬蟲時遇到etree紅線問題及解決

    這篇文章主要介紹了Pycharm使用爬蟲時遇到etree紅線問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評論

焉耆| 乌拉特中旗| 神木县| 杨浦区| 湖南省| 都兰县| 都兰县| 高州市| 攀枝花市| 新和县| 奇台县| 临潭县| 城步| 邯郸县| 察雅县| 宜城市| 黄浦区| 宜宾市| 四川省| 沁源县| 枣庄市| 天祝| 如东县| 阿克苏市| 陇西县| 吉安市| 阿克陶县| 阿城市| 海丰县| 台北市| 武强县| 体育| 弥渡县| 阜康市| 双流县| 西平县| 永顺县| 资源县| 衡南县| 吴江市| 芦山县|