diff options
| author | Russell Keith-Magee <russell@keith-magee.com> | 2012-10-02 22:52:45 +0800 |
|---|---|---|
| committer | Russell Keith-Magee <russell@keith-magee.com> | 2012-10-02 22:52:45 +0800 |
| commit | 3b6f980bedbbf091fe29bececa2b262d2084ce4d (patch) | |
| tree | 79878a20a702edb034cd732c850ff5546059edf6 /django/db | |
| parent | 5f8b97f9fb058e5e02f1f99423fc3b0020ecdeb0 (diff) | |
Fixed #19049 -- Ensure that swapped models aren't included in reverse field caches.
Thanks to Ivan Virabyan for the report.
Diffstat (limited to 'django/db')
| -rw-r--r-- | django/db/models/fields/related.py | 8 | ||||
| -rw-r--r-- | django/db/models/options.py | 24 |
2 files changed, 18 insertions, 14 deletions
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index c065162aa0..2c35411d7c 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -1025,8 +1025,8 @@ class ForeignKey(RelatedField, Field): def contribute_to_related_class(self, cls, related): # Internal FK's - i.e., those with a related name ending with '+' - - # don't get a related descriptor. - if not self.rel.is_hidden(): + # and swapped models don't get a related descriptor. + if not self.rel.is_hidden() and related.model._meta.swapped: setattr(cls, related.get_accessor_name(), ForeignRelatedObjectsDescriptor(related)) if self.rel.limit_choices_to: cls._meta.related_fkey_lookups.append(self.rel.limit_choices_to) @@ -1265,8 +1265,8 @@ class ManyToManyField(RelatedField, Field): def contribute_to_related_class(self, cls, related): # Internal M2Ms (i.e., those with a related name ending with '+') - # don't get a related descriptor. - if not self.rel.is_hidden(): + # and swapped models don't get a related descriptor. + if not self.rel.is_hidden() and not related.model._meta.swapped: setattr(cls, related.get_accessor_name(), ManyRelatedObjectsDescriptor(related)) # Set up the accessors for the column names on the m2m table diff --git a/django/db/models/options.py b/django/db/models/options.py index d2de96ea5c..d471bba262 100644 --- a/django/db/models/options.py +++ b/django/db/models/options.py @@ -418,13 +418,14 @@ class Options(object): # Collect also objects which are in relation to some proxy child/parent of self. proxy_cache = cache.copy() for klass in get_models(include_auto_created=True, only_installed=False): - for f in klass._meta.local_fields: - if f.rel and not isinstance(f.rel.to, six.string_types): - if self == f.rel.to._meta: - cache[RelatedObject(f.rel.to, klass, f)] = None - proxy_cache[RelatedObject(f.rel.to, klass, f)] = None - elif self.concrete_model == f.rel.to._meta.concrete_model: - proxy_cache[RelatedObject(f.rel.to, klass, f)] = None + if not klass._meta.swapped: + for f in klass._meta.local_fields: + if f.rel and not isinstance(f.rel.to, six.string_types): + if self == f.rel.to._meta: + cache[RelatedObject(f.rel.to, klass, f)] = None + proxy_cache[RelatedObject(f.rel.to, klass, f)] = None + elif self.concrete_model == f.rel.to._meta.concrete_model: + proxy_cache[RelatedObject(f.rel.to, klass, f)] = None self._related_objects_cache = cache self._related_objects_proxy_cache = proxy_cache @@ -460,9 +461,12 @@ class Options(object): else: cache[obj] = model for klass in get_models(only_installed=False): - for f in klass._meta.local_many_to_many: - if f.rel and not isinstance(f.rel.to, six.string_types) and self == f.rel.to._meta: - cache[RelatedObject(f.rel.to, klass, f)] = None + if not klass._meta.swapped: + for f in klass._meta.local_many_to_many: + if (f.rel + and not isinstance(f.rel.to, six.string_types) + and self == f.rel.to._meta): + cache[RelatedObject(f.rel.to, klass, f)] = None if app_cache_ready(): self._related_many_to_many_cache = cache return cache |
