diff options
Diffstat (limited to 'tests/modeltests/select_related/models.py')
| -rw-r--r-- | tests/modeltests/select_related/models.py | 47 |
1 files changed, 42 insertions, 5 deletions
diff --git a/tests/modeltests/select_related/models.py b/tests/modeltests/select_related/models.py index f0fd121665..9d64cf24c6 100644 --- a/tests/modeltests/select_related/models.py +++ b/tests/modeltests/select_related/models.py @@ -27,13 +27,13 @@ class Phylum(models.Model): kingdom = models.ForeignKey(Kingdom) def __unicode__(self): return self.name - + class Klass(models.Model): name = models.CharField(max_length=50) phylum = models.ForeignKey(Phylum) def __unicode__(self): return self.name - + class Order(models.Model): name = models.CharField(max_length=50) klass = models.ForeignKey(Klass) @@ -63,7 +63,7 @@ def create_tree(stringtree): names = stringtree.split() models = [Domain, Kingdom, Phylum, Klass, Order, Family, Genus, Species] assert len(names) == len(models), (names, models) - + parent = None for name, model in zip(names, models): try: @@ -100,7 +100,7 @@ __test__ = {'API_TESTS':""" # However, a select_related() call will fill in those related objects without any extra queries: >>> db.reset_queries() ->>> person = Species.objects.select_related().get(name="sapiens") +>>> person = Species.objects.select_related(depth=10).get(name="sapiens") >>> person.genus.family.order.klass.phylum.kingdom.domain <Domain: Eukaryota> >>> len(db.connection.queries) @@ -129,7 +129,7 @@ __test__ = {'API_TESTS':""" >>> pea.genus.family.order.klass.phylum.kingdom.domain <Domain: Eukaryota> -# Notice: one few query than above because of depth=1 +# Notice: one fewer queries than above because of depth=1 >>> len(db.connection.queries) 7 @@ -147,6 +147,43 @@ __test__ = {'API_TESTS':""" >>> len(db.connection.queries) 5 +>>> s = Species.objects.all().select_related(depth=1).extra(select={'a': 'select_related_species.id + 10'})[0] +>>> s.id + 10 == s.a +True + +# The optional fields passed to select_related() control which related models +# we pull in. This allows for smaller queries and can act as an alternative +# (or, in addition to) the depth parameter. + +# In the next two cases, we explicitly say to select the 'genus' and +# 'genus.family' models, leading to the same number of queries as before. +>>> db.reset_queries() +>>> world = Species.objects.select_related('genus__family') +>>> [o.genus.family for o in world] +[<Family: Drosophilidae>, <Family: Hominidae>, <Family: Fabaceae>, <Family: Amanitacae>] +>>> len(db.connection.queries) +1 + +>>> db.reset_queries() +>>> world = Species.objects.filter(genus__name='Amanita').select_related('genus__family') +>>> [o.genus.family.order for o in world] +[<Order: Agaricales>] +>>> len(db.connection.queries) +2 + +>>> db.reset_queries() +>>> Species.objects.all().select_related('genus__family__order').order_by('id')[0:1].get().genus.family.order.name +u'Diptera' +>>> len(db.connection.queries) +1 + +# Specifying both "depth" and fields is an error. +>>> Species.objects.select_related('genus__family__order', depth=4) +Traceback (most recent call last): +... +TypeError: Cannot pass both "depth" and fields to select_related() + # Reset DEBUG to where we found it. >>> settings.DEBUG = False """} + |
