1

I wrote this function in python to dump an object to json. Is there any better and more tested way to do it using the library?

def model_jsonify(self,instance):
    from sqlalchemy.orm import class_mapper , ColumnProperty
    attrs = [prop.key for prop in class_mapper(instance.__class__).iterate_properties if isinstance(prop, ColumnProperty)]

    r = dict()

    for attr in attrs :
        c = getattr(instance,attr)
        assert not c is None
        r[attr] = c

    return r
Javier Loureiro
  • 354
  • 2
  • 12

1 Answers1

0

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)
Javier Loureiro
  • 354
  • 2
  • 12