Just to complete the question, I write this code. You can query a simple ORM object, or a list (the result when you query a join). But you cant serialize individual fields (like query a join with some fiels only)
def model_jsonify(self,instance):
from sqlalchemy.orm import class_mapper , ColumnProperty
from sqlalchemy.util import KeyedTuple
if isinstance(instance,KeyedTuple) :
attrs = []
r = dict()
for i in instance :
modelname = type(i).__name__.lower()
attrs = [prop.key for prop in class_mapper(i.__class__).iterate_properties if isinstance(prop, ColumnProperty)]
r[modelname] = dict((c, getattr(i, c)) for c in attrs)
return r
else :
attrs = [prop.key for prop in class_mapper(instance.__class__).iterate_properties if isinstance(prop, ColumnProperty)]
r = dict()
modelname = type(instance).__name__.lower()
r[modelname] = dict((c, getattr(instance, c)) for c in attrs)
return r
This is a small test I wrote with the two queries:
purchaseorder = mi.session.query(PurchaseOrder).first()
assert purchaseorder != None
j = mi.model_jsonify (purchaseorder)
assert not j is None
assert isinstance(j,dict)
assert j['purchaseorder']['name'] == 'january'
bompurchaseorderlines = mi.session.query(BoMPurchaseOrderLine,SupplierLine).join(SupplierLine).all()
assert not bompurchaseorderlines is None
for purchaseorder in bompurchaseorderlines :
j = mi.model_jsonify (purchaseorder)