Skip to content

Instantly share code, notes, and snippets.

@toudi
Created November 14, 2014 14:37
Show Gist options
  • Save toudi/3c3b35fc6345cdde97c1 to your computer and use it in GitHub Desktop.
Save toudi/3c3b35fc6345cdde97c1 to your computer and use it in GitHub Desktop.
recursive model_to_dict
from django.forms.models import model_to_dict as fmodel_to_dict
from django.db.models.related import RelatedObject
def remove_baseattr_name(prefix):
def inner(value):
return value[len(prefix)+1:]
return inner
def model_to_dict(instance, fields=[], exclude=[]):
"""
example use:
model_to_dict(mymodel, fields=[], exclude=["related.field.name"])
"""
basemodel = fmodel_to_dict(instance, fields, exclude)
# get all foreign keys.
for fname, type_ in instance._meta._name_map.items():
if fname not in exclude:
if type(type_[0]) is RelatedObject:
basemodel[fname] = []
for relobj in getattr(instance, fname).all():
related_serialize = model_to_dict(
relobj,
map(remove_baseattr_name(fname), fields),
map(remove_baseattr_name(fname), exclude)
)
del related_serialize[type_[0].field.name]
del related_serialize[relobj._meta.pk.name]
if hasattr(relobj, '_dump'):
related_serialize = relobj._dump(related_serialize)
basemodel[fname].append(related_serialize)
return basemodel
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment