当前位置: 首页 > article >正文

django重写响应对象

全局返回数据

在项目目录下新建utils文件夹,创建serializers.py文件。

这个文件用于定义全局返回对象。

BaseSerializer是用于定义数据序列化的基本框架

class BaseSerializer(object):
    def __init__(self, obj):
        self.obj = obj

    def to_dict(self):
        return {}

MetaSerializers是用于处理分页元数据

class MetaSerializers(object):
    def __init__(self, page, page_count, total_count, **kwargs):
        self.page = page        # 当前页
        self.page_count = page_count        # 总页数
        self.total_count = total_count        # 总记录条数

    def to_dict(self):
        return {
            "total_count": self.total_count,
            "page_count": self.page_count,
            "current_page": self.page,
        }

BaseListSerializer用于处理数据库的记录

        这个对象将分页后的对象列表及其元数据转换为一个字典。
        首先,它使用 MetaSerializer 序列化分页元数据。
        然后,它遍历当前页的对象列表,对每个对象调用 get_object 方法进行序列化,并将结果收集到一个列表中。
        最后,它返回一个包含 meta(分页元数据)和 objects(序列化后的对象列表)的字典。

class BaseListSerializer(object):
    def __init__(self,page_obj,paginator=None,object_List=[]):
        self.page_obj = page_obj    #当前页对象
        self.paginator = paginator if paginator else page_obj.paginator        #分页器对象
        self.object_List = object_List if object_List else page_obj.object_list        #当前页数据列表


    def get_object(self,obj):
        # 对象的内容,此方法要在子类中重写
        return {}

    def to_dict(self):
        page = self.page_obj.number
        page_count = self.page_obj.paginator.num_pages
        total_count = self.page_obj.paginator.count
        meta = MetaSerializers(page=page, page_count=page_count, total_count=total_count).to_dict()

        objects = []
        for obj in self.object_List:
            objects.append(self.get_object(obj))
        return {
            "meta": meta,
            "objects": objects,
        }

定义返回数据格式

打开模块,同样新建serializers.py文件。引入在utils.serializers中的BaseListSerializer

from utils.serializers import BaseListSerializer

 新建一个类,继承BaseListSerializer,重写getobject方法以定义数据格式。

class SightListSerializer(BaseListSerializer):
    def get_object(self,obj):
        return {
            'id': obj.id,
            'name': obj.name,
            'main_img': obj.main_img.url,
            'min_price': obj.min_price,
            'score': obj.score,
            'province': obj.province,
            'city': obj.city,
            # TODO 数据暂时无法获取
            'comment_count': 0
        }

使用该类返回数据

class SightListView(ListView):
    # 重写查询方法
    paginate_by = 5     # 每页五条数据

    def get_queryset(self):
        # 定义查询条件
        return querySet

    def render_to_response(self, context, **response_kwargs):
        page_obj = context['page_obj']
        if page_obj is not None:
            data = serializers.SightListSerializer(page_obj).to_dict()
            return http.JsonResponse(data)
        else:
            return NotFoundJsonResponse()

当查询执行成功的时候返回的数据格式如下

{
    "meta": {
        "total_count": 9,
        "page_count": 2,
        "current_page": 1
    },
    "objects": [
        {
            "id": 9,
            "name": "岭南印象园",
            "main_img": "/static/home/hot/h8.jpg",
            "min_price": 47.1,
            "score": 5.0,
            "province": "广东省",
            "city": "广州市",
            "comment_count": 0
        },
        {
            "id": 8,
            "name": "珠江夜游",
            "main_img": "/static/home/hot/h10.jpg",
            "min_price": 47.5,
            "score": 4.5,
            "province": "广东省",
            "city": "广州市",
            "comment_count": 0
        },
        {
            "id": 7,
            "name": "沈阳科学中心",
            "main_img": "/static/home/hot/h6.jpg",
            "min_price": 42.0,
            "score": 4.5,
            "province": "广东省",
            "city": "广州市",
            "comment_count": 0
        },
        {
            "id": 6,
            "name": "宝墨园",
            "main_img": "/static/home/hot/h5.jpg",
            "min_price": 41.0,
            "score": 5.0,
            "province": "广东省",
            "city": "广州市",
            "comment_count": 0
        }
    ]
}

json格式的数据,包裹meta分页对象和objects数据对象列表

总结

将返回数据的方法和格式抽象到一个类中方便调用和维护,提高可读性。


http://www.kler.cn/a/375707.html

相关文章:

  • 如何获取当前数据库版本?
  • npm入门教程19:npm包管理
  • Java XML一口气讲完!(p≧w≦q)
  • 分享几款开源好用的图片在线编辑,适合做快速应用嵌入
  • Java项目实战II基于Java+Spring Boot+MySQL的工程教育认证的计算机课程管理平台(源码+数据库+文档)
  • glide 加载gif 卡顿内存高问题 优化
  • 基于随机森林的智能手机用户行为分类及流量预测分析
  • 【Axure原型分享】颜色选择器——填充颜色
  • 数据采集-Kepware 安装证书异常处理
  • ElementUI el-form表单多层数组的校验
  • C9800 bundle转换为install
  • 测试外包服务 | 从人员外包到测试工具、测试平台,提供全方位的测试解决方案~
  • 如何面对鸿蒙系统
  • Vite学习之模式
  • Edge-labeling graph neural network for few-shot learning in CVPR论文笔记
  • docker 可用镜像服务地址(2024.10.31亲测可用)
  • stm32103c8t6 pwm驱动舵机(SG90)
  • Python实现Tonelli-Shanks算法
  • stm32 如何生成.bin文件-keil fromelf.exe使用
  • 鸿蒙系统不断发展,有与安卓、iOS 形成三足鼎立之势
  • 什么是SMO算法
  • 聊一聊Elasticsearch的基本原理与形成机制
  • java毕业设计之教学资源库系统的设计与实现(springboot)
  • HTML 基础概念:什么是 HTML ? HTML 的构成 与 HTML 基本文档结构
  • 「C/C++」C++STL容器库 之 std::tuple 多变元组
  • JS中的正则表达式