将属性添加到Django结果对象

Jac*_*and 2 python django

我想在序列化之前向Django结果对象添加一个或两个属性.我的Python技能相当薄弱,所以我们走了.

我想要做:

products = Product.objects.all()
products.totalPages = 10
products.currentPage = 1
data = serializers.serialize('json', products)
Run Code Online (Sandbox Code Playgroud)

在不尝试添加totalPages和currentPage属性的情况下,此代码可以正常工作.但我想添加这些属性,以便将一个漂亮的JSON对象传递回客户端.

有什么想法吗?

Sky*_*and 6

不知道你希望那些attrs进入序列化返回的"列表".也许您希望数据在最终结果中成为关键:

import json

from django.core import serializers

products = Product.objects.all()
# data is a python list
data = json.loads(serializers.serialize('json', products))
# d is a dict
d = {}
# data is a list nested in d
d['results'] = data
# more keys for d
d['totalPages'] = 10                                       
d['currentPage'] = 1
# data is a json string representation of the dict
data = json.dumps(d)                                       
Run Code Online (Sandbox Code Playgroud)

也许你可以在聚合和注释中找到用法:http://docs.djangoproject.com/en/dev/topics/db/aggregation/

更新:请注意默认序列化程序的行为可能不是您想要的.代码django.utils.simplejson.encoder是高度优化的,但我不太确定如何使用自定义属性等.在过去,我刚刚在我的模型类上创建了一个方法/属性,它将实例中的数据转换为包含我想要的dict.所以,而不是

data = json.loads(serializers.serialize('json', products))
Run Code Online (Sandbox Code Playgroud)

你可以使用(假设你已经as_dict在Product上定义了一个方法):

data = [p.as_dict() for p in products]
Run Code Online (Sandbox Code Playgroud)