Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed the way symmetrical many-to-many relations are recorded in the …

…Options class.

These types of relations don't have reverse accessor names, so that name can be
used by a normal field on the model. Fixed #7107.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@7764 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 0e692fda9ca57909216e68a998f2752885c23725 1 parent 279fc85
Malcolm Tredinnick malcolmt authored
11 django/db/models/options.py
View
@@ -274,14 +274,17 @@ def init_name_map(self):
"""
Initialises the field name -> field object mapping.
"""
- cache = dict([(f.name, (f, m, True, False)) for f, m in
- self.get_fields_with_model()])
- for f, model in self.get_m2m_with_model():
- cache[f.name] = (f, model, True, True)
+ cache = {}
+ # We intentionally handle related m2m objects first so that symmetrical
+ # m2m accessor names can be overridden, if necessary.
for f, model in self.get_all_related_m2m_objects_with_model():
cache[f.field.related_query_name()] = (f, model, False, True)
for f, model in self.get_all_related_objects_with_model():
cache[f.field.related_query_name()] = (f, model, False, False)
+ for f, model in self.get_m2m_with_model():
+ cache[f.name] = (f, model, True, True)
+ for f, model in self.get_fields_with_model():
+ cache[f.name] = (f, model, True, False)
if self.order_with_respect_to:
cache['_order'] = OrderWrt(), None, True, False
if app_cache_ready():
13 tests/regressiontests/queries/models.py
View
@@ -90,6 +90,15 @@ class Number(models.Model):
def __unicode__(self):
return unicode(self.num)
+# Symmetrical m2m field with a normal field using the reverse accesor name
+# ("valid").
+class Valid(models.Model):
+ valid = models.CharField(max_length=10)
+ parent = models.ManyToManyField('self')
+
+ class Meta:
+ ordering = ['valid']
+
# Some funky cross-linked models for testing a couple of infinite recursion
# cases.
class X(models.Model):
@@ -768,5 +777,9 @@ class Child(models.Model):
>>> len(Tag.objects.order_by('parent__name'))
5
+Bug #7107 -- this shouldn't create an infinite loop.
+>>> Valid.objects.all()
+[]
+
"""}
Please sign in to comment.
Something went wrong with that request. Please try again.