Skip to content

Commit 4bca062

Browse files
Merge pull request encode#2363 from kdazzle/models_meta-cleanup
First pass at refactoring get_field_info in utils.model_meta
2 parents 5d8c456 + a747972 commit 4bca062

File tree

1 file changed

+43
-14
lines changed

1 file changed

+43
-14
lines changed

rest_framework/utils/model_meta.py

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def _resolve_model(obj):
3535
Resolve supplied `obj` to a Django model class.
3636
3737
`obj` must be a Django model class itself, or a string
38-
representation of one. Useful in situtations like GH #1225 where
38+
representation of one. Useful in situations like GH #1225 where
3939
Django may not have resolved a string-based reference to a model in
4040
another model's foreign key definition.
4141
@@ -56,23 +56,44 @@ def _resolve_model(obj):
5656

5757
def get_field_info(model):
5858
"""
59-
Given a model class, returns a `FieldInfo` instance containing metadata
60-
about the various field types on the model.
59+
Given a model class, returns a `FieldInfo` instance, which is a
60+
`namedtuple`, containing metadata about the various field types on the model
61+
including information about their relationships.
6162
"""
6263
opts = model._meta.concrete_model._meta
6364

64-
# Deal with the primary key.
65+
pk = _get_pk(opts)
66+
fields = _get_fields(opts)
67+
forward_relations = _get_forward_relationships(opts)
68+
reverse_relations = _get_reverse_relationships(opts)
69+
fields_and_pk = _merge_fields_and_pk(pk, fields)
70+
relationships = _merge_relationships(forward_relations, reverse_relations)
71+
72+
return FieldInfo(pk, fields, forward_relations, reverse_relations,
73+
fields_and_pk, relationships)
74+
75+
76+
def _get_pk(opts):
6577
pk = opts.pk
6678
while pk.rel and pk.rel.parent_link:
67-
# If model is a child via multitable inheritance, use parent's pk.
79+
# If model is a child via multi-table inheritance, use parent's pk.
6880
pk = pk.rel.to._meta.pk
6981

70-
# Deal with regular fields.
82+
return pk
83+
84+
85+
def _get_fields(opts):
7186
fields = OrderedDict()
7287
for field in [field for field in opts.fields if field.serialize and not field.rel]:
7388
fields[field.name] = field
7489

75-
# Deal with forward relationships.
90+
return fields
91+
92+
93+
def _get_forward_relationships(opts):
94+
"""
95+
Returns an `OrderedDict` of field names to `RelationInfo`.
96+
"""
7697
forward_relations = OrderedDict()
7798
for field in [field for field in opts.fields if field.serialize and field.rel]:
7899
forward_relations[field.name] = RelationInfo(
@@ -93,7 +114,13 @@ def get_field_info(model):
93114
)
94115
)
95116

96-
# Deal with reverse relationships.
117+
return forward_relations
118+
119+
120+
def _get_reverse_relationships(opts):
121+
"""
122+
Returns an `OrderedDict` of field names to `RelationInfo`.
123+
"""
97124
reverse_relations = OrderedDict()
98125
for relation in opts.get_all_related_objects():
99126
accessor_name = relation.get_accessor_name()
@@ -117,18 +144,20 @@ def get_field_info(model):
117144
)
118145
)
119146

120-
# Shortcut that merges both regular fields and the pk,
121-
# for simplifying regular field lookup.
147+
return reverse_relations
148+
149+
150+
def _merge_fields_and_pk(pk, fields):
122151
fields_and_pk = OrderedDict()
123152
fields_and_pk['pk'] = pk
124153
fields_and_pk[pk.name] = pk
125154
fields_and_pk.update(fields)
126155

127-
# Shortcut that merges both forward and reverse relationships
156+
return fields_and_pk
128157

129-
relations = OrderedDict(
158+
159+
def _merge_relationships(forward_relations, reverse_relations):
160+
return OrderedDict(
130161
list(forward_relations.items()) +
131162
list(reverse_relations.items())
132163
)
133-
134-
return FieldInfo(pk, fields, forward_relations, reverse_relations, fields_and_pk, relations)

0 commit comments

Comments
 (0)