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数据对象列表
总结
将返回数据的方法和格式抽象到一个类中方便调用和维护,提高可读性。