| 1 | from django.db import models
|
|---|
| 2 |
|
|---|
| 3 | class Page(models.Model):
|
|---|
| 4 | name = models.CharField(maxlength=100)
|
|---|
| 5 |
|
|---|
| 6 | class Poll(models.Model):
|
|---|
| 7 | question = models.CharField(maxlength=200)
|
|---|
| 8 | page = models.ForeignKey(Page)
|
|---|
| 9 |
|
|---|
| 10 | class Meta:
|
|---|
| 11 | db_table = 'poll'
|
|---|
| 12 |
|
|---|
| 13 | class Choice(models.Model):
|
|---|
| 14 | poll = models.ForeignKey(Poll, related_name="choices")
|
|---|
| 15 | choice = models.CharField(maxlength=200)
|
|---|
| 16 |
|
|---|
| 17 | class Meta:
|
|---|
| 18 | db_table = 'poll_choices'
|
|---|
| 19 |
|
|---|
| 20 | __test__ = {'API_TESTS':"""
|
|---|
| 21 | # Regression test for the use of .select_related() on querysets.
|
|---|
| 22 | # Set up some initial models
|
|---|
| 23 | >>> from django.db import connection
|
|---|
| 24 | >>> s1 = Page.objects.create(name="Hi")
|
|---|
| 25 | >>> p1 = Poll.objects.create(question='Why?', page=s1)
|
|---|
| 26 | >>> p2 = Poll.objects.create(question='Why 2?', page=s1)
|
|---|
| 27 | >>> p3 = Poll.objects.create(question='Why 3?', page=s1)
|
|---|
| 28 | >>> p4 = Poll.objects.create(question='Why 4?', page=s1)
|
|---|
| 29 | >>> c1 = Choice.objects.create(poll=p1, choice='Because.')
|
|---|
| 30 | >>> c2 = Choice.objects.create(poll=p1, choice='Why Not?')
|
|---|
| 31 | >>> c3 = Choice.objects.create(poll=p1, choice='Group by is useful.')
|
|---|
| 32 |
|
|---|
| 33 | # select_related(depth=1) shouldn't cause us extra queries
|
|---|
| 34 | >>> z = Choice.objects.all().select_related(depth=1).order_by('id')
|
|---|
| 35 | >>> q = len(connection.queries)
|
|---|
| 36 | >>> z[0].poll
|
|---|
| 37 | <Poll: Poll object>
|
|---|
| 38 | >>> len(connection.queries)-q
|
|---|
| 39 | 0
|
|---|
| 40 |
|
|---|
| 41 | # select_related('poll') shouldn't cause us extra queries
|
|---|
| 42 | >>> z = Choice.objects.all().select_related('poll').order_by('id')
|
|---|
| 43 | >>> q = len(connection.queries)
|
|---|
| 44 | >>> z[0].poll
|
|---|
| 45 | <Poll: Poll object>
|
|---|
| 46 | >>> len(connection.queries)-q
|
|---|
| 47 | 0
|
|---|
| 48 |
|
|---|
| 49 | # select_related('poll__page') shouldn't cause us extra queries
|
|---|
| 50 | >>> z = Choice.objects.all().select_related('poll__page').order_by('id')
|
|---|
| 51 | >>> q = len(connection.queries)
|
|---|
| 52 | >>> z[0].poll.page
|
|---|
| 53 | <Page: Page object>
|
|---|
| 54 | >>> len(connection.queries)-q
|
|---|
| 55 | 0
|
|---|
| 56 |
|
|---|
| 57 | # verify it's joining on the right table
|
|---|
| 58 | >>> Choice.objects.all().select_related('poll').order_by('id')[0:1].get().poll.question
|
|---|
| 59 | 'Why?'
|
|---|
| 60 |
|
|---|
| 61 | # should raise FieldDoesNotExist exception
|
|---|
| 62 | >>> Choice.objects.all().select_related('wtf').order_by('id')
|
|---|
| 63 | Traceback (most recent call last):
|
|---|
| 64 | ...
|
|---|
| 65 | FieldDoesNotExist: Choice has no field named wtf
|
|---|
| 66 | """}
|
|---|