django: django rest framework 数据的查找、过滤、排序

本文介绍了如何使用Django Rest Framework实现数据的查找、过滤和排序。通过示例代码展示了如何定义Model、Serializer、ModelViewSet和Router,以及如何实现条件过滤、搜索和自定义排序功能,为前端提供接口支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

django: django rest framework 数据的查找、过滤、排序


对于管理系统,常常需要展示列表数据,我们对于列表内的数据常常需要查找、过滤、排序等操作,其中查找等操作大部分是在后台进行的。django rest framework可以轻松的实现数据的查找、过滤等操作。接下来我们将以实际的例子进行介绍。

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

例如cmdb系统,作为资产管理系统常常需要对数据进行过滤或查找,获取期望的信息。


实现model

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

实现serializer

接下来需要实现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

对于modelviewset,我们可以围绕它对用户请求做相应的处理。常见的是对model进行增加、删除、查找、修改等。在这部分我们需要实现ServerViewSet:

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是我们的自定义类型(关于分页类型在django分页文章中进行了讲解)。


实现router

如果用户想要访问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))
]

对于servers的访问都由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可以添加相应的过滤条件:

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值