from django.test import TestCase from .models import ( CompetingTeam, Event, Group, IndividualCompetitor, Membership, Person, ) class MultiTableTests(TestCase): @classmethod def setUpTestData(cls): cls.alice = Person.objects.create(name="Alice") cls.bob = Person.objects.create(name="Bob") cls.chris = Person.objects.create(name="Chris") cls.dan = Person.objects.create(name="Dan") cls.team_alpha = Group.objects.create(name="Alpha") Membership.objects.create(person=cls.alice, group=cls.team_alpha) Membership.objects.create(person=cls.bob, group=cls.team_alpha) cls.event = Event.objects.create(name="Exposition Match") IndividualCompetitor.objects.create(event=cls.event, person=cls.chris) IndividualCompetitor.objects.create(event=cls.event, person=cls.dan) CompetingTeam.objects.create(event=cls.event, team=cls.team_alpha) def test_m2m_query(self): result = self.event.teams.all() self.assertCountEqual(result, [self.team_alpha]) def test_m2m_reverse_query(self): result = self.chris.event_set.all() self.assertCountEqual(result, [self.event]) def test_m2m_query_proxied(self): result = self.event.special_people.all() self.assertCountEqual(result, [self.chris, self.dan]) def test_m2m_reverse_query_proxied(self): result = self.chris.special_event_set.all() self.assertCountEqual(result, [self.event]) def test_m2m_prefetch_proxied(self): result = Event.objects.filter(name="Exposition Match").prefetch_related( "special_people" ) with self.assertNumQueries(2): self.assertCountEqual(result, [self.event]) self.assertEqual( sorted(p.name for p in result[0].special_people.all()), ["Chris", "Dan"] ) def test_m2m_prefetch_reverse_proxied(self): result = Person.objects.filter(name="Dan").prefetch_related("special_event_set") with self.assertNumQueries(2): self.assertCountEqual(result, [self.dan]) self.assertEqual( [event.name for event in result[0].special_event_set.all()], ["Exposition Match"], )