为Django结果对象添加属性

3 投票
1 回答
3632 浏览
提问于 2025-04-16 12:42

我想在把Django的结果对象转成JSON格式之前,给它添加一两个属性。不过我的Python水平不太好,所以我来请教一下。

我想做的是:

products = Product.objects.all()
products.totalPages = 10
products.currentPage = 1
data = serializers.serialize('json', products)

如果不加totalPages和currentPage这两个属性,这段代码运行得很好。但是我想加上这两个属性,这样我就可以把一个看起来不错的JSON对象返回给客户端。

有什么想法吗?

1 个回答

6

不太确定你想把那些属性放到“序列化”返回的“列表”哪里。也许你希望数据能以某个键的形式出现在最终结果中:

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)                                       

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

更新:请注意,默认的序列化器行为可能不是你想要的。django.utils.simplejson.encoder中的代码经过高度优化,但我不太确定你该如何让它使用自定义属性之类的。在过去,我通常会在我的模型类中创建一个方法或属性,把实例中的数据转换成一个字典,里面正好包含我想要的内容。所以,代替

data = json.loads(serializers.serialize('json', products))

你可以使用(前提是你在Product上定义了一个方法as_dict):

data = [p.as_dict() for p in products]

撰写回答