django rest framework 데이터 찾기,필터,정렬 예제

관리 시스템 에 대해 서 는 목록 데 이 터 를 보 여 줘 야 합 니 다.우 리 는 목록 에 있 는 데 이 터 를 찾 고 여과 하 며 정렬 하 는 등 작업 을 해 야 합 니 다.그 중에서 찾기 등 작업 은 대부분 배경 에서 이 루어 집 니 다.django rest framework 는 데이터 검색,여과 등 을 쉽게 실현 할 수 있 습 니 다.이어서 우 리 는 실제 적 인 예 로 소개 할 것 이다.
예시 코드 github 주소:https://github.com/jinjidejuren/drf_learn
예 를 들 어 cmdb 시스템 은 자산 관리 시스템 으로서 데 이 터 를 여과 하거나 찾 아 원 하 는 정 보 를 얻어 야 한다.
실현 모델
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

직렬 화 실현
다음은 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 에 대해 서 는 사용자 요청 에 대해 해당 하 는 처 리 를 할 수 있 습 니 다.흔히 볼 수 있 는 것 은 모델 에 대한 증가,삭제,찾기,수정 등 이다.이 부분 에서 우 리 는 ServerViewSet 를 실현 해 야 한다.

class ServerViewSet(viewsets.ModelViewSet):
  """
         
  """
  queryset = Server.objects.all().order_by('-created_time')
  serializer_class = ServerSerializer
  pagination_class = MyFormatResultsSetPagination
query set 는 반환 목록 의 형식 을 지정 합 니 다.모든 정 보 를 되 돌려 주 고 생 성 시간 에 따라 역순 으로 배열 합 니 다.그러면 최신 정 보 를 먼저 되 돌려 주 고 사용자 의 조작 습관 에 부합 합 니 다.
serializer_class 는 ServerSerializer 가 지정 한 fields 내용 으로 되 돌아 오 는 직렬 화 형식 을 정의 합 니 다.
pagination_class 는 페이지 의 종 류 를 지정 합 니 다.이 MyFormat Results SetPagination 은 사용자 정의 형식 입 니 다.
라 우 터 구현
사용자 가 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))
]

server 에 대한 접근 은 모두 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', )
여기 filterbackends 는 필터 의 종 류 를 지정 합 니 다.DjangoFilterBackend(필터),SearchFilter(검색),OrderingFIlter(정렬)를 설정 합 니 다.
1.여과
필 터 는 필터 의 설정 클래스 를 ServerFilter 로 설 정 했 습 니 다.ServerFilter 는 apps/assets/filers.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.검색
검색 은 검색 이름 이'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
}

searchfields 에서 다양한 검색 방식 을 지정 할 수 있 습 니 다.
'^name'은 name 으로 시작 합 니 다.
'=name'정확 한 일치
전체 검색(my sql 데이터 원본 만 지원)
'$'정규 일치
대응 하 는 searchfileds 예제 다음 과 같 습 니 다:

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 의 정의,직렬 화,첨삭 검사 와 검색,정렬 등 기능 을 어떻게 하 는 지 를 소개 하 며 백 엔 드 인 터 페 이 스 를 작성 하 는 데 필수 적 인 기술 입 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기