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数据对象列表

总结

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

相关推荐
古希腊掌管学习的神2 分钟前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
LucianaiB1 小时前
探索CSDN博客数据:使用Python爬虫技术
开发语言·爬虫·python
PieroPc3 小时前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel
云和数据.ChenGuang4 小时前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite
向前看-6 小时前
验证码机制
前端·后端
梧桐树04297 小时前
python常用内建模块:collections
python
Dream_Snowar7 小时前
速通Python 第三节
开发语言·python
超爱吃士力架8 小时前
邀请逻辑
java·linux·后端
蓝天星空8 小时前
Python调用open ai接口
人工智能·python
jasmine s9 小时前
Pandas
开发语言·python