diff options
| author | Kyle Valade | 2014-12-29 00:35:00 -0800 | 
|---|---|---|
| committer | Kyle Valade | 2014-12-29 00:35:00 -0800 | 
| commit | a7479721c844926f377085d8c336a2f60b7b2a38 (patch) | |
| tree | 0d589ef9b17bef350292861b1ac7c16e269cfe8a /rest_framework/utils | |
| parent | 5d8c45681a945b955d9336b0fd1e4ebccf0df895 (diff) | |
| download | django-rest-framework-a7479721c844926f377085d8c336a2f60b7b2a38.tar.bz2 | |
First pass at refactoring get_field_info in utils.model_meta
Diffstat (limited to 'rest_framework/utils')
| -rw-r--r-- | rest_framework/utils/model_meta.py | 57 | 
1 files changed, 43 insertions, 14 deletions
| diff --git a/rest_framework/utils/model_meta.py b/rest_framework/utils/model_meta.py index c98725c6..375d2e8c 100644 --- a/rest_framework/utils/model_meta.py +++ b/rest_framework/utils/model_meta.py @@ -35,7 +35,7 @@ def _resolve_model(obj):      Resolve supplied `obj` to a Django model class.      `obj` must be a Django model class itself, or a string -    representation of one.  Useful in situtations like GH #1225 where +    representation of one.  Useful in situations like GH #1225 where      Django may not have resolved a string-based reference to a model in      another model's foreign key definition. @@ -56,23 +56,44 @@ def _resolve_model(obj):  def get_field_info(model):      """ -    Given a model class, returns a `FieldInfo` instance containing metadata -    about the various field types on the model. +    Given a model class, returns a `FieldInfo` instance, which is a +    `namedtuple`, containing metadata about the various field types on the model +    including information about their relationships.      """      opts = model._meta.concrete_model._meta -    # Deal with the primary key. +    pk = _get_pk(opts) +    fields = _get_fields(opts) +    forward_relations = _get_forward_relationships(opts) +    reverse_relations = _get_reverse_relationships(opts) +    fields_and_pk = _merge_fields_and_pk(pk, fields) +    relationships = _merge_relationships(forward_relations, reverse_relations) + +    return FieldInfo(pk, fields, forward_relations, reverse_relations, +                     fields_and_pk, relationships) + + +def _get_pk(opts):      pk = opts.pk      while pk.rel and pk.rel.parent_link: -        # If model is a child via multitable inheritance, use parent's pk. +        # If model is a child via multi-table inheritance, use parent's pk.          pk = pk.rel.to._meta.pk -    # Deal with regular fields. +    return pk + + +def _get_fields(opts):      fields = OrderedDict()      for field in [field for field in opts.fields if field.serialize and not field.rel]:          fields[field.name] = field -    # Deal with forward relationships. +    return fields + + +def _get_forward_relationships(opts): +    """ +    Returns an `OrderedDict` of field names to `RelationInfo`. +    """      forward_relations = OrderedDict()      for field in [field for field in opts.fields if field.serialize and field.rel]:          forward_relations[field.name] = RelationInfo( @@ -93,7 +114,13 @@ def get_field_info(model):              )          ) -    # Deal with reverse relationships. +    return forward_relations + + +def _get_reverse_relationships(opts): +    """ +    Returns an `OrderedDict` of field names to `RelationInfo`. +    """      reverse_relations = OrderedDict()      for relation in opts.get_all_related_objects():          accessor_name = relation.get_accessor_name() @@ -117,18 +144,20 @@ def get_field_info(model):              )          ) -    # Shortcut that merges both regular fields and the pk, -    # for simplifying regular field lookup. +    return reverse_relations + + +def _merge_fields_and_pk(pk, fields):      fields_and_pk = OrderedDict()      fields_and_pk['pk'] = pk      fields_and_pk[pk.name] = pk      fields_and_pk.update(fields) -    # Shortcut that merges both forward and reverse relationships +    return fields_and_pk -    relations = OrderedDict( + +def _merge_relationships(forward_relations, reverse_relations): +    return OrderedDict(          list(forward_relations.items()) +          list(reverse_relations.items())      ) - -    return FieldInfo(pk, fields, forward_relations, reverse_relations, fields_and_pk, relations) | 
