| 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 |
"""} |
|---|