Skip to content

Instantly share code, notes, and snippets.

@oinopion
Created February 29, 2012 13:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save oinopion/1940663 to your computer and use it in GitHub Desktop.
Save oinopion/1940663 to your computer and use it in GitHub Desktop.
Render dict from Django model
def render_dict(pattern, data):
"""Render Django model to dict (helps in rendering JSON)"""
out = {}
for item in pattern:
if isinstance(item, basestring):
attr = manager_getattr(data, item)
out[item] = attr
elif isinstance(item, dict):
for subitem, subpattern in item.items():
attr = manager_getattr(data, subitem)
out[subitem] = render_dict(subpattern, attr)
else:
if len(item) == 2:
subitem, subpattern = item
subdata = manager_getattr(data, subitem)
else:
subitem, custom_getattr, subpattern = item
subdata = custom_getattr(data)
out[subitem] = [render_dict(subpattern, d) for d in subdata]
return out
# helpers
def smart_getattr(obj, attr_name):
attr = getattr(obj, attr_name)
if callable(attr):
attr = attr()
return attr
def manager_getattr(obj, attr_name):
attr = smart_getattr(obj, attr_name)
if isinstance(attr, models.Manager):
attr = attr.all()
return attr
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment