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
This commit is contained in:
parent
279fc8599b
commit
0e692fda9c
|
@ -274,14 +274,17 @@ class Options(object):
|
||||||
"""
|
"""
|
||||||
Initialises the field name -> field object mapping.
|
Initialises the field name -> field object mapping.
|
||||||
"""
|
"""
|
||||||
cache = dict([(f.name, (f, m, True, False)) for f, m in
|
cache = {}
|
||||||
self.get_fields_with_model()])
|
# We intentionally handle related m2m objects first so that symmetrical
|
||||||
for f, model in self.get_m2m_with_model():
|
# m2m accessor names can be overridden, if necessary.
|
||||||
cache[f.name] = (f, model, True, True)
|
|
||||||
for f, model in self.get_all_related_m2m_objects_with_model():
|
for f, model in self.get_all_related_m2m_objects_with_model():
|
||||||
cache[f.field.related_query_name()] = (f, model, False, True)
|
cache[f.field.related_query_name()] = (f, model, False, True)
|
||||||
for f, model in self.get_all_related_objects_with_model():
|
for f, model in self.get_all_related_objects_with_model():
|
||||||
cache[f.field.related_query_name()] = (f, model, False, False)
|
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:
|
if self.order_with_respect_to:
|
||||||
cache['_order'] = OrderWrt(), None, True, False
|
cache['_order'] = OrderWrt(), None, True, False
|
||||||
if app_cache_ready():
|
if app_cache_ready():
|
||||||
|
|
|
@ -90,6 +90,15 @@ class Number(models.Model):
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return unicode(self.num)
|
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
|
# Some funky cross-linked models for testing a couple of infinite recursion
|
||||||
# cases.
|
# cases.
|
||||||
class X(models.Model):
|
class X(models.Model):
|
||||||
|
@ -768,5 +777,9 @@ just count the number of results).
|
||||||
>>> len(Tag.objects.order_by('parent__name'))
|
>>> len(Tag.objects.order_by('parent__name'))
|
||||||
5
|
5
|
||||||
|
|
||||||
|
Bug #7107 -- this shouldn't create an infinite loop.
|
||||||
|
>>> Valid.objects.all()
|
||||||
|
[]
|
||||||
|
|
||||||
"""}
|
"""}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue