django重写响应对象

全局返回数据

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

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

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

python 复制代码
class BaseSerializer(object):
    def __init__(self, obj):
        self.obj = obj

    def to_dict(self):
        return {}

MetaSerializers是用于处理分页元数据

python 复制代码
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(序列化后的对象列表)的字典。

python 复制代码
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

python 复制代码
from utils.serializers import BaseListSerializer

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

python 复制代码
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
        }

使用该类返回数据

python 复制代码
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()

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

python 复制代码
{
    "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数据对象列表

总结

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

相关推荐
秃头佛爷1 分钟前
Python学习大纲总结及注意事项
开发语言·python·学习
深度学习lover1 小时前
<项目代码>YOLOv8 苹果腐烂识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·苹果腐烂识别
paopaokaka_luck2 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
API快乐传递者2 小时前
淘宝反爬虫机制的主要手段有哪些?
爬虫·python
码农小旋风4 小时前
详解K8S--声明式API
后端
Peter_chq4 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml44 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~4 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616884 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
阡之尘埃4 小时前
Python数据分析案例61——信贷风控评分卡模型(A卡)(scorecardpy 全面解析)
人工智能·python·机器学习·数据分析·智能风控·信贷风控