diff options
| author | Simon Charette <charette.s@gmail.com> | 2016-01-09 18:05:57 -0500 |
|---|---|---|
| committer | Simon Charette <charette.s@gmail.com> | 2016-01-11 12:23:23 -0500 |
| commit | bc7d201bdbaeac14a49f51a9ef292d6312b4c45e (patch) | |
| tree | c57fb348dbf867c1639fa1c0be1fbebbbc622d92 /django | |
| parent | 2ed2db2ea3246c7f985ddfbb780850a23e851f9d (diff) | |
Fixed #25858 -- Bound abstract model application relative relationships.
Thanks to Karl Hobley for the report and Markus, Shai, Aymeric for their input
and Tim for the review.
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/models/fields/related.py | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index c877ec1708..162a84793d 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -34,7 +34,7 @@ from .reverse_related import ( RECURSIVE_RELATIONSHIP_CONSTANT = 'self' -def resolve_relation(scope_model, relation): +def resolve_relation(scope_model, relation, resolve_recursive_relationship=True): """ Transform relation into a model or fully-qualified model string of the form "app_label.ModelName", relative to scope_model. @@ -49,12 +49,11 @@ def resolve_relation(scope_model, relation): """ # Check for recursive relations if relation == RECURSIVE_RELATIONSHIP_CONSTANT: - relation = scope_model - + if resolve_recursive_relationship: + relation = scope_model # Look for an "app.Model" relation - if isinstance(relation, six.string_types): - if "." not in relation: - relation = "%s.%s" % (scope_model._meta.app_label, relation) + elif isinstance(relation, six.string_types) and '.' not in relation: + relation = "%s.%s" % (scope_model._meta.app_label, relation) return relation @@ -301,6 +300,11 @@ class RelatedField(Field): field.remote_field.model = related field.do_related_class(related, model) lazy_related_operation(resolve_related_class, cls, self.remote_field.model, field=self) + else: + # Bind a lazy reference to the app in which the model is defined. + self.remote_field.model = resolve_relation( + cls, self.remote_field.model, resolve_recursive_relationship=False + ) def get_forward_related_filter(self, obj): """ @@ -1553,6 +1557,11 @@ class ManyToManyField(RelatedField): lazy_related_operation(resolve_through_model, cls, self.remote_field.through, field=self) elif not cls._meta.swapped: self.remote_field.through = create_many_to_many_intermediary_model(self, cls) + else: + # Bind a lazy reference to the app in which the model is defined. + self.remote_field.through = resolve_relation( + cls, self.remote_field.through, resolve_recursive_relationship=False + ) # Add the descriptor for the m2m relation. setattr(cls, self.name, ManyToManyDescriptor(self.remote_field, reverse=False)) |
