1. from django.test import TestCase
    
  2. 
    
  3. from .models import (
    
  4.     CompetingTeam,
    
  5.     Event,
    
  6.     Group,
    
  7.     IndividualCompetitor,
    
  8.     Membership,
    
  9.     Person,
    
  10. )
    
  11. 
    
  12. 
    
  13. class MultiTableTests(TestCase):
    
  14.     @classmethod
    
  15.     def setUpTestData(cls):
    
  16.         cls.alice = Person.objects.create(name="Alice")
    
  17.         cls.bob = Person.objects.create(name="Bob")
    
  18.         cls.chris = Person.objects.create(name="Chris")
    
  19.         cls.dan = Person.objects.create(name="Dan")
    
  20.         cls.team_alpha = Group.objects.create(name="Alpha")
    
  21.         Membership.objects.create(person=cls.alice, group=cls.team_alpha)
    
  22.         Membership.objects.create(person=cls.bob, group=cls.team_alpha)
    
  23.         cls.event = Event.objects.create(name="Exposition Match")
    
  24.         IndividualCompetitor.objects.create(event=cls.event, person=cls.chris)
    
  25.         IndividualCompetitor.objects.create(event=cls.event, person=cls.dan)
    
  26.         CompetingTeam.objects.create(event=cls.event, team=cls.team_alpha)
    
  27. 
    
  28.     def test_m2m_query(self):
    
  29.         result = self.event.teams.all()
    
  30.         self.assertCountEqual(result, [self.team_alpha])
    
  31. 
    
  32.     def test_m2m_reverse_query(self):
    
  33.         result = self.chris.event_set.all()
    
  34.         self.assertCountEqual(result, [self.event])
    
  35. 
    
  36.     def test_m2m_query_proxied(self):
    
  37.         result = self.event.special_people.all()
    
  38.         self.assertCountEqual(result, [self.chris, self.dan])
    
  39. 
    
  40.     def test_m2m_reverse_query_proxied(self):
    
  41.         result = self.chris.special_event_set.all()
    
  42.         self.assertCountEqual(result, [self.event])
    
  43. 
    
  44.     def test_m2m_prefetch_proxied(self):
    
  45.         result = Event.objects.filter(name="Exposition Match").prefetch_related(
    
  46.             "special_people"
    
  47.         )
    
  48.         with self.assertNumQueries(2):
    
  49.             self.assertCountEqual(result, [self.event])
    
  50.             self.assertEqual(
    
  51.                 sorted(p.name for p in result[0].special_people.all()), ["Chris", "Dan"]
    
  52.             )
    
  53. 
    
  54.     def test_m2m_prefetch_reverse_proxied(self):
    
  55.         result = Person.objects.filter(name="Dan").prefetch_related("special_event_set")
    
  56.         with self.assertNumQueries(2):
    
  57.             self.assertCountEqual(result, [self.dan])
    
  58.             self.assertEqual(
    
  59.                 [event.name for event in result[0].special_event_set.all()],
    
  60.                 ["Exposition Match"],
    
  61.             )