@@ -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
5757def 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