Django

Code

Changeset 6521

Show
Ignore:
Timestamp:
10/15/07 00:51:19 (9 months ago)
Author:
mtredinnick
Message:

queryset-refactor: Fixed a possibility of shooting oneself in the foot and
creating infinite recursion with select_related(). Refs #3045, #3288.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/queryset-refactor/django/db/models/query.py

    r6517 r6521  
    295295        obj = self._clone() 
    296296        obj.query.select_related = true_or_false 
    297         obj.query.max_depth = depth 
     297        if depth: 
     298            obj.query.max_depth = depth 
    298299        return obj 
    299300 
  • django/branches/queryset-refactor/django/db/models/sql/query.py

    r6517 r6521  
    8888        self.distinct = False 
    8989        self.select_related = False 
    90         self.max_depth = 0 
     90 
     91        # Arbitrary maximum limit for select_related to prevent infinite 
     92        # recursion. Can be changed by the depth parameter to select_related(). 
     93        self.max_depth = 5 
    9194 
    9295        # These are for extensions. The contents are more or less appended 
  • django/branches/queryset-refactor/tests/regressiontests/queries/models.py

    r6519 r6521  
    8080    def __unicode__(self): 
    8181        return self.title 
     82 
     83# Some funky cross-linked models for testing a couple of infinite recursion 
     84# cases. 
     85class X(models.Model): 
     86    y = models.ForeignKey('Y') 
     87 
     88class Y(models.Model): 
     89    x1 = models.ForeignKey(X, related_name='y1') 
    8290 
    8391__test__ = {'API_TESTS':""" 
     
    354362[{'note': 1}, {'note': 2}] 
    355363 
    356 # Bug 5261 
     364Bug #5261 
    357365>>> Note.objects.exclude(Q()) 
    358366[<Note: n1>, <Note: n2>, <Note: n3>] 
    359367 
     368Bug #3045, #3288 
     369Once upon a time, select_related() with circular relations would loop 
     370infinitely if you forgot to specify "depth". Now we set an arbitrary default 
     371upper bound. 
     372>>> X.objects.all() 
     373[] 
     374>>> X.objects.select_related() 
     375[] 
     376 
    360377"""} 
    361378