1. from django.test import TestCase
    
  2. 
    
  3. from .models import Organiser, Pool, PoolStyle, Tournament
    
  4. 
    
  5. 
    
  6. class ExistingRelatedInstancesTests(TestCase):
    
  7.     @classmethod
    
  8.     def setUpTestData(cls):
    
  9.         cls.t1 = Tournament.objects.create(name="Tourney 1")
    
  10.         cls.t2 = Tournament.objects.create(name="Tourney 2")
    
  11.         cls.o1 = Organiser.objects.create(name="Organiser 1")
    
  12.         cls.p1 = Pool.objects.create(
    
  13.             name="T1 Pool 1", tournament=cls.t1, organiser=cls.o1
    
  14.         )
    
  15.         cls.p2 = Pool.objects.create(
    
  16.             name="T1 Pool 2", tournament=cls.t1, organiser=cls.o1
    
  17.         )
    
  18.         cls.p3 = Pool.objects.create(
    
  19.             name="T2 Pool 1", tournament=cls.t2, organiser=cls.o1
    
  20.         )
    
  21.         cls.p4 = Pool.objects.create(
    
  22.             name="T2 Pool 2", tournament=cls.t2, organiser=cls.o1
    
  23.         )
    
  24.         cls.ps1 = PoolStyle.objects.create(name="T1 Pool 2 Style", pool=cls.p2)
    
  25.         cls.ps2 = PoolStyle.objects.create(name="T2 Pool 1 Style", pool=cls.p3)
    
  26. 
    
  27.     def test_foreign_key(self):
    
  28.         with self.assertNumQueries(2):
    
  29.             tournament = Tournament.objects.get(pk=self.t1.pk)
    
  30.             pool = tournament.pool_set.all()[0]
    
  31.             self.assertIs(tournament, pool.tournament)
    
  32. 
    
  33.     def test_foreign_key_prefetch_related(self):
    
  34.         with self.assertNumQueries(2):
    
  35.             tournament = Tournament.objects.prefetch_related("pool_set").get(
    
  36.                 pk=self.t1.pk
    
  37.             )
    
  38.             pool = tournament.pool_set.all()[0]
    
  39.             self.assertIs(tournament, pool.tournament)
    
  40. 
    
  41.     def test_foreign_key_multiple_prefetch(self):
    
  42.         with self.assertNumQueries(2):
    
  43.             tournaments = list(
    
  44.                 Tournament.objects.prefetch_related("pool_set").order_by("pk")
    
  45.             )
    
  46.             pool1 = tournaments[0].pool_set.all()[0]
    
  47.             self.assertIs(tournaments[0], pool1.tournament)
    
  48.             pool2 = tournaments[1].pool_set.all()[0]
    
  49.             self.assertIs(tournaments[1], pool2.tournament)
    
  50. 
    
  51.     def test_queryset_or(self):
    
  52.         tournament_1 = self.t1
    
  53.         tournament_2 = self.t2
    
  54.         with self.assertNumQueries(1):
    
  55.             pools = tournament_1.pool_set.all() | tournament_2.pool_set.all()
    
  56.             related_objects = {pool.tournament for pool in pools}
    
  57.             self.assertEqual(related_objects, {tournament_1, tournament_2})
    
  58. 
    
  59.     def test_queryset_or_different_cached_items(self):
    
  60.         tournament = self.t1
    
  61.         organiser = self.o1
    
  62.         with self.assertNumQueries(1):
    
  63.             pools = tournament.pool_set.all() | organiser.pool_set.all()
    
  64.             first = pools.filter(pk=self.p1.pk)[0]
    
  65.             self.assertIs(first.tournament, tournament)
    
  66.             self.assertIs(first.organiser, organiser)
    
  67. 
    
  68.     def test_queryset_or_only_one_with_precache(self):
    
  69.         tournament_1 = self.t1
    
  70.         tournament_2 = self.t2
    
  71.         # 2 queries here as pool 3 has tournament 2, which is not cached
    
  72.         with self.assertNumQueries(2):
    
  73.             pools = tournament_1.pool_set.all() | Pool.objects.filter(pk=self.p3.pk)
    
  74.             related_objects = {pool.tournament for pool in pools}
    
  75.             self.assertEqual(related_objects, {tournament_1, tournament_2})
    
  76.         # and the other direction
    
  77.         with self.assertNumQueries(2):
    
  78.             pools = Pool.objects.filter(pk=self.p3.pk) | tournament_1.pool_set.all()
    
  79.             related_objects = {pool.tournament for pool in pools}
    
  80.             self.assertEqual(related_objects, {tournament_1, tournament_2})
    
  81. 
    
  82.     def test_queryset_and(self):
    
  83.         tournament = self.t1
    
  84.         organiser = self.o1
    
  85.         with self.assertNumQueries(1):
    
  86.             pools = tournament.pool_set.all() & organiser.pool_set.all()
    
  87.             first = pools.filter(pk=self.p1.pk)[0]
    
  88.             self.assertIs(first.tournament, tournament)
    
  89.             self.assertIs(first.organiser, organiser)
    
  90. 
    
  91.     def test_one_to_one(self):
    
  92.         with self.assertNumQueries(2):
    
  93.             style = PoolStyle.objects.get(pk=self.ps1.pk)
    
  94.             pool = style.pool
    
  95.             self.assertIs(style, pool.poolstyle)
    
  96. 
    
  97.     def test_one_to_one_select_related(self):
    
  98.         with self.assertNumQueries(1):
    
  99.             style = PoolStyle.objects.select_related("pool").get(pk=self.ps1.pk)
    
  100.             pool = style.pool
    
  101.             self.assertIs(style, pool.poolstyle)
    
  102. 
    
  103.     def test_one_to_one_multi_select_related(self):
    
  104.         with self.assertNumQueries(1):
    
  105.             poolstyles = list(PoolStyle.objects.select_related("pool").order_by("pk"))
    
  106.             self.assertIs(poolstyles[0], poolstyles[0].pool.poolstyle)
    
  107.             self.assertIs(poolstyles[1], poolstyles[1].pool.poolstyle)
    
  108. 
    
  109.     def test_one_to_one_prefetch_related(self):
    
  110.         with self.assertNumQueries(2):
    
  111.             style = PoolStyle.objects.prefetch_related("pool").get(pk=self.ps1.pk)
    
  112.             pool = style.pool
    
  113.             self.assertIs(style, pool.poolstyle)
    
  114. 
    
  115.     def test_one_to_one_multi_prefetch_related(self):
    
  116.         with self.assertNumQueries(2):
    
  117.             poolstyles = list(PoolStyle.objects.prefetch_related("pool").order_by("pk"))
    
  118.             self.assertIs(poolstyles[0], poolstyles[0].pool.poolstyle)
    
  119.             self.assertIs(poolstyles[1], poolstyles[1].pool.poolstyle)
    
  120. 
    
  121.     def test_reverse_one_to_one(self):
    
  122.         with self.assertNumQueries(2):
    
  123.             pool = Pool.objects.get(pk=self.p2.pk)
    
  124.             style = pool.poolstyle
    
  125.             self.assertIs(pool, style.pool)
    
  126. 
    
  127.     def test_reverse_one_to_one_select_related(self):
    
  128.         with self.assertNumQueries(1):
    
  129.             pool = Pool.objects.select_related("poolstyle").get(pk=self.p2.pk)
    
  130.             style = pool.poolstyle
    
  131.             self.assertIs(pool, style.pool)
    
  132. 
    
  133.     def test_reverse_one_to_one_prefetch_related(self):
    
  134.         with self.assertNumQueries(2):
    
  135.             pool = Pool.objects.prefetch_related("poolstyle").get(pk=self.p2.pk)
    
  136.             style = pool.poolstyle
    
  137.             self.assertIs(pool, style.pool)
    
  138. 
    
  139.     def test_reverse_one_to_one_multi_select_related(self):
    
  140.         with self.assertNumQueries(1):
    
  141.             pools = list(Pool.objects.select_related("poolstyle").order_by("pk"))
    
  142.             self.assertIs(pools[1], pools[1].poolstyle.pool)
    
  143.             self.assertIs(pools[2], pools[2].poolstyle.pool)
    
  144. 
    
  145.     def test_reverse_one_to_one_multi_prefetch_related(self):
    
  146.         with self.assertNumQueries(2):
    
  147.             pools = list(Pool.objects.prefetch_related("poolstyle").order_by("pk"))
    
  148.             self.assertIs(pools[1], pools[1].poolstyle.pool)
    
  149.             self.assertIs(pools[2], pools[2].poolstyle.pool)