1 from __future__
import absolute_import
3 from django
.test
import TestCase
5 from .models
import (User
, UserProfile
, UserStat
, UserStatResult
, StatDetails
,
6 AdvancedUserStat
, Image
, Product
)
9 class ReverseSelectRelatedTestCase(TestCase
):
11 user
= User
.objects
.create(username
="test")
12 userprofile
= UserProfile
.objects
.create(user
=user
, state
="KS",
14 results
= UserStatResult
.objects
.create(results
='first results')
15 userstat
= UserStat
.objects
.create(user
=user
, posts
=150,
17 details
= StatDetails
.objects
.create(base_stats
=userstat
, comments
=259)
19 user2
= User
.objects
.create(username
="bob")
20 results2
= UserStatResult
.objects
.create(results
='moar results')
21 advstat
= AdvancedUserStat
.objects
.create(user
=user2
, posts
=200, karma
=5,
23 StatDetails
.objects
.create(base_stats
=advstat
, comments
=250)
26 with self
.assertNumQueries(1):
27 u
= User
.objects
.select_related("userprofile").get(username
="test")
28 self
.assertEqual(u
.userprofile
.state
, "KS")
30 def test_follow_next_level(self
):
31 with self
.assertNumQueries(1):
32 u
= User
.objects
.select_related("userstat__results").get(username
="test")
33 self
.assertEqual(u
.userstat
.posts
, 150)
34 self
.assertEqual(u
.userstat
.results
.results
, 'first results')
36 def test_follow_two(self
):
37 with self
.assertNumQueries(1):
38 u
= User
.objects
.select_related("userprofile", "userstat").get(username
="test")
39 self
.assertEqual(u
.userprofile
.state
, "KS")
40 self
.assertEqual(u
.userstat
.posts
, 150)
42 def test_follow_two_next_level(self
):
43 with self
.assertNumQueries(1):
44 u
= User
.objects
.select_related("userstat__results", "userstat__statdetails").get(username
="test")
45 self
.assertEqual(u
.userstat
.results
.results
, 'first results')
46 self
.assertEqual(u
.userstat
.statdetails
.comments
, 259)
48 def test_forward_and_back(self
):
49 with self
.assertNumQueries(1):
50 stat
= UserStat
.objects
.select_related("user__userprofile").get(user__username
="test")
51 self
.assertEqual(stat
.user
.userprofile
.state
, 'KS')
52 self
.assertEqual(stat
.user
.userstat
.posts
, 150)
54 def test_back_and_forward(self
):
55 with self
.assertNumQueries(1):
56 u
= User
.objects
.select_related("userstat").get(username
="test")
57 self
.assertEqual(u
.userstat
.user
.username
, 'test')
59 def test_not_followed_by_default(self
):
60 with self
.assertNumQueries(2):
61 u
= User
.objects
.select_related().get(username
="test")
62 self
.assertEqual(u
.userstat
.posts
, 150)
64 def test_follow_from_child_class(self
):
65 with self
.assertNumQueries(1):
66 stat
= AdvancedUserStat
.objects
.select_related('user', 'statdetails').get(posts
=200)
67 self
.assertEqual(stat
.statdetails
.comments
, 250)
68 self
.assertEqual(stat
.user
.username
, 'bob')
70 def test_follow_inheritance(self
):
71 with self
.assertNumQueries(1):
72 stat
= UserStat
.objects
.select_related('user', 'advanceduserstat').get(posts
=200)
73 self
.assertEqual(stat
.advanceduserstat
.posts
, 200)
74 self
.assertEqual(stat
.user
.username
, 'bob')
75 self
.assertEqual(stat
.advanceduserstat
.user
.username
, 'bob')
77 def test_nullable_relation(self
):
78 im
= Image
.objects
.create(name
="imag1")
79 p1
= Product
.objects
.create(name
="Django Plushie", image
=im
)
80 p2
= Product
.objects
.create(name
="Talking Django Plushie")
82 with self
.assertNumQueries(1):
83 result
= sorted(Product
.objects
.select_related("image"), key
=lambda x
: x
.name
)
84 self
.assertEqual([p
.name
for p
in result
], ["Django Plushie", "Talking Django Plushie"])
86 self
.assertEqual(p1
.image
, im
)
87 # Check for ticket #13839
88 self
.assertIsNone(p2
.image
)
90 def test_missing_reverse(self
):
92 Ticket #13839: select_related() should NOT cache None
93 for missing objects on a reverse 1-1 relation.
95 with self
.assertNumQueries(1):
96 user
= User
.objects
.select_related('userprofile').get(username
='bob')
97 with self
.assertRaises(UserProfile
.DoesNotExist
):
100 def test_nullable_missing_reverse(self
):
102 Ticket #13839: select_related() should NOT cache None
103 for missing objects on a reverse 0-1 relation.
105 Image
.objects
.create(name
="imag1")
107 with self
.assertNumQueries(1):
108 image
= Image
.objects
.select_related('product').get()
109 with self
.assertRaises(Product
.DoesNotExist
):