我有使用Flask-SQLAlchemy的这个模型:
class Menu(Document, db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(80), unique=True, index=True)
price = db.Column(db.Numeric)
我可以使用Flask-Restless为这个模型创建api。问题是我从api url获取HTTP GET:
File "/usr/lib/python2.6/json/encoder.py", line 344, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: Decimal('10000.0000000000') is not JSON serializable
问题很明显,JSON编码器无法编码映射到价格的十进制值(数值列类型)。是否有任何工作重点可以使用自定义JSON编码器启用Flask-Restless?
答案 0 :(得分:5)
这是我做的:
import simplejson as json
def postprocessor(data):
json.dumps(data, use_decimal=True)
return data
manager.create_api(Menu, methods=['GET', 'POST', 'PATCH'], allow_patch_many=True, postprocessors={
'PATCH_MANY': [postprocessor],
'GET_MANY': [postprocessor],
'POST': [postprocessor]
})
所以我的想法是使用Flask-Restless'后处理器用simplejson而不是json对数据进行编码,因为simplejson通过指定use_decimal = True来支持Decimal()类型。
编辑:实际上,安装simplejson似乎已经足够了。您的代码无需更改。
答案 1 :(得分:3)
正如mickael的回答所示,安装simpejson就足够了。后处理器的正确语法如下:
#first argument must be named as 'result', not 'data'
def postprocessor(result):
json.dumps(result, use_decimal=True)
#return data - postprocessors/preprocessors should not return values!