diff --git a/frappe/model/meta.py b/frappe/model/meta.py index c363e63f4f..5031f7f901 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -134,24 +134,23 @@ class Meta(Document): def as_dict(self, no_nulls=False): def serialize(doc): out = {} - for key in doc.__dict__: - value = doc.__dict__.get(key) - + for key, value in doc.__dict__.items(): if isinstance(value, (list, tuple)): - if len(value) > 0 and hasattr(value[0], "__dict__"): - value = [serialize(d) for d in value] - else: + if not value or not isinstance(value[0], BaseDocument): # non standard list object, skip continue - if isinstance(value, (str, int, float, datetime, list, tuple)) or ( - not no_nulls and value is None + value = [serialize(d) for d in value] + + if ( + isinstance(value, (str, int, float, datetime, list, tuple)) + or (not no_nulls and value is None) ): out[key] = value # set empty lists for unset table fields for table_field in DOCTYPE_TABLE_FIELDS: - if not out.get(table_field.fieldname): + if out.get(table_field.fieldname) is None: out[table_field.fieldname] = [] return out