自学内容网 自学内容网

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

总结

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


原文地址:https://blog.csdn.net/mecende/article/details/143432927

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!