Created
November 14, 2014 14:37
-
-
Save toudi/3c3b35fc6345cdde97c1 to your computer and use it in GitHub Desktop.
recursive model_to_dict
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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