summaryrefslogtreecommitdiff
path: root/django/db
diff options
context:
space:
mode:
authorRussell Keith-Magee <russell@keith-magee.com>2012-10-02 22:52:45 +0800
committerRussell Keith-Magee <russell@keith-magee.com>2012-10-02 22:52:45 +0800
commit3b6f980bedbbf091fe29bececa2b262d2084ce4d (patch)
tree79878a20a702edb034cd732c850ff5546059edf6 /django/db
parent5f8b97f9fb058e5e02f1f99423fc3b0020ecdeb0 (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.py8
-rw-r--r--django/db/models/options.py24
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