mirror of
				https://github.com/django/django.git
				synced 2025-11-04 05:35:37 +00:00 
			
		
		
		
	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
					
				
					 2 changed files with 20 additions and 4 deletions
				
			
		| 
						 | 
					@ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue