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

总结

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

相关推荐
一行玩python15 分钟前
SQLAlchemy,ORM的Python标杆!
开发语言·数据库·python·oracle
颜淡慕潇35 分钟前
【K8S系列】kubectl describe pod显示ImagePullBackOff,如何进一步排查?
后端·云原生·容器·kubernetes
数据小爬虫@1 小时前
利用Python爬虫获取淘宝店铺详情
开发语言·爬虫·python
Clarify1 小时前
docker部署go游戏服务器(进阶版)
后端
IT书架2 小时前
golang面试题
开发语言·后端·golang
编程修仙2 小时前
Collections工具类
linux·windows·python
芝麻团坚果2 小时前
对subprocess启动的子进程使用VSCode python debugger
linux·ide·python·subprocess·vscode debugger
机器之心2 小时前
全球十亿级轨迹点驱动,首个轨迹基础大模型来了
人工智能·后端
EterNity_TiMe_2 小时前
【论文复现】神经网络的公式推导与代码实现
人工智能·python·深度学习·神经网络·数据分析·特征分析
Stara05113 小时前
Git推送+拉去+uwsgi+Nginx服务器部署项目
git·python·mysql·nginx·gitee·github·uwsgi