1.  过滤

(1)如果进行条件过滤,需要首先安装django-filter模块:

pip install django-filter

(2)在配置文件settings.py中添加应用django_filters:

INSTALLED_APPS = [
    ......
    'apps.assets.apps.AssetsConfig',
    "rest_framework",
    "django_filters",
]

(3)在apps/assets/views.py导入包:

from rest_framework import filters
from django_filters import rest_framework
from .filters import ServerFilter

(4)ServerViewSet添加相应的过滤条件如下:

class ServerViewSet(viewsets.ModelViewSet):
    queryset = Server.objects.all()
    serializer_class = ServerSerializer

    pagination_class = PageNumberPagination
    pagination_class.page_size = 2

    # 过滤、搜索、排序
    # 这里的filter_backends指定了过滤的类型,此处设定了DjangoFilterBackend(过滤)、
    # SearchFilter(搜索)和OrderingFIlter(排序)。
    filter_backends = [rest_framework.DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
    filterset_class = ServerFilter
    # server_name模糊搜索,=brand精确匹配, status必须输入原值:online/offline,而不能输入上线/下线
    search_fields = ["server_name", "=brand", "status"]
    ordering_fields = ["cpus", "ram", "disk", "product_date"]
    ordering = ["-created_time"]

(5)过滤设定了过滤的配置类为ServerFilter,关于ServerFilter在apps/assets/filters.py文件中进行了定义:

import django_filters
from .models import Server
from django_filters import FilterSet


class ServerFilter(FilterSet):
    server_name = django_filters.CharFilter(field_name='server_name', lookup_expr='icontains')
    brand = django_filters.CharFilter(field_name='brand', lookup_expr='icontains')
    cpus = django_filters.NumberFilter(field_name='cpus')
    ram = django_filters.NumberFilter(field_name='ram')
    disk = django_filters.NumberFilter(field_name="disk")

    class Meta:
        model = Server
        fields = ['server_name', 'brand', 'cpus', 'ram', 'disk', ]

(6)也就是说可以通过’server_name’, ‘brand’, ‘cpus’, ‘ram’, ‘disk’对物理服务器的信息进行过滤,得到相应的序列化列表

例如获取cpu为2核、内存ram为4g的屋里服务器

得到物理服务器列表中cpu都为2,内存都为4

HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "count": 2,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 4,
            "server_name": "服务器3",
            "server_num": "004",
            "brand": "乌班图品牌",
            "model": "dddd",
            "cpus": 2,
            "ram": 4,
            "disk": 800,
            "product_date": "2020-12-29T14:30:20.953199",
            "status": "online",
            "created_time": "2020-12-29T14:30:20.953199",
            "modified_time": "2020-12-29T14:30:20.953199"
        },
        {
            "id": 2,
            "server_name": "windows",
            "server_num": "002",
            "brand": "windows服务器",
            "model": "aabbcc",
            "cpus": 2,
            "ram": 4,
            "disk": 1000,
            "product_date": "2020-12-29T13:58:29.152850",
            "status": "online",
            "created_time": "2020-12-29T13:58:29.152850",
            "modified_time": "2020-12-29T13:58:29.152850"
        }
    ]
}

2. 搜索

(1)搜索需要指定search关键字需要查询的信息,例如搜索名称包含"test"的服务器:

http://127.0.0.1:8000/assets/servers/?search=test

(2)获取结果:

HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "count": 2,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 4,
            "server_name": "01-test-服务器",
            "server_num": "004",
            "brand": "乌班图品牌",
            "model": "dddd",
            "cpus": 2,
            "ram": 4,
            "disk": 800,
            "product_date": "2020-12-29T14:30:20.953199",
            "status": "online",
            "created_time": "2020-12-29T14:30:20.953199",
            "modified_time": "2020-12-29T14:30:20.953199"
        },
        {
            "id": 3,
            "server_name": "01-test-服务器",
            "server_num": "003",
            "brand": "联想品牌",
            "model": "qqqq",
            "cpus": 1,
            "ram": 4,
            "disk": 250,
            "product_date": "2020-12-29T13:59:31.192399",
            "status": "online",
            "created_time": "2020-12-29T13:59:31.192399",
            "modified_time": "2020-12-29T13:59:31.192399"
        }
    ]
}

(3)在search_fields中可以指定多种查找方式:
‘^name’ 以name开头
‘=name’ 精确匹配
‘@’ 全局检索(只有mysql数据源支持)
‘$’ 正则匹配

对应的search_fileds示例如下:

search_fields = ["^server_name", "=brand", "status"]

3. 排序

(1)在ordering字段指定了默认排序方式(按照创建时间逆序排序):

ordering = ["-created_time"]

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

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

(3)如果要自定义排序字段,需要指定ordering字段的内容:

ordering_fields = ["cpus", "ram", "disk", "product_date"]

例如按照磁盘大小降序排列服务器:

http://127.0.0.1:8000/assets/servers/?ordering=-disk

(4)结果如下:

HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "count": 4,
    "next": "http://127.0.0.1:8000/assets/servers/?ordering=-disk&page=2",
    "previous": null,
    "results": [
        {
            "id": 2,
            "server_name": "windows",
            "server_num": "002",
            "brand": "windows服务器",
            "model": "aabbcc",
            "cpus": 2,
            "ram": 4,
            "disk": 1000,
            "product_date": "2020-12-29T13:58:29.152850",
            "status": "online",
            "created_time": "2020-12-29T13:58:29.152850",
            "modified_time": "2020-12-29T13:58:29.152850"
        },
        {
            "id": 4,
            "server_name": "01-test-服务器",
            "server_num": "004",
            "brand": "乌班图品牌",
            "model": "dddd",
            "cpus": 2,
            "ram": 4,
            "disk": 800,
            "product_date": "2020-12-29T14:30:20.953199",
            "status": "online",
            "created_time": "2020-12-29T14:30:20.953199",
            "modified_time": "2020-12-29T14:30:20.953199"
        }
    ]
}

结论:本章内容介绍了django rest framework中过滤、搜索、排序等功能,是书写后端接口必须掌握的技巧

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐