2013-02-21 201 views
3

轉儲十進制值我一直在使用燒瓶SQLAlchemy的這種模式:燒瓶不寧從燒瓶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) 

,我可以使用燒瓶不寧該模型創建的API。問題是,當我HTTP GET從API URL:

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是否有任何解決方法?

回答

3

這裏是我做過什麼:

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] 
}) 

這樣的想法是使用燒瓶不寧後處理編碼與simplejson而不是JSON數據,因爲simplejson支持十進制()型通過指定use_decimal =真。

編輯:其實它似乎安裝simplejson可能就足夠了。您的代碼無需更改。

+0

是的,正是我所做的。 – desdulianto 2013-03-11 15:39:46

+1

只需安裝simplejson工作!謝謝。 – Hindol 2015-01-03 20:56:47

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!