1. from django.test import TestCase
    
  2. 
    
  3. from .models import Flea, House, Person, Pet, Room
    
  4. 
    
  5. 
    
  6. class UUIDPrefetchRelated(TestCase):
    
  7.     def test_prefetch_related_from_uuid_model(self):
    
  8.         Pet.objects.create(name="Fifi").people.add(
    
  9.             Person.objects.create(name="Ellen"),
    
  10.             Person.objects.create(name="George"),
    
  11.         )
    
  12. 
    
  13.         with self.assertNumQueries(2):
    
  14.             pet = Pet.objects.prefetch_related("people").get(name="Fifi")
    
  15.         with self.assertNumQueries(0):
    
  16.             self.assertEqual(2, len(pet.people.all()))
    
  17. 
    
  18.     def test_prefetch_related_to_uuid_model(self):
    
  19.         Person.objects.create(name="Bella").pets.add(
    
  20.             Pet.objects.create(name="Socks"),
    
  21.             Pet.objects.create(name="Coffee"),
    
  22.         )
    
  23. 
    
  24.         with self.assertNumQueries(2):
    
  25.             person = Person.objects.prefetch_related("pets").get(name="Bella")
    
  26.         with self.assertNumQueries(0):
    
  27.             self.assertEqual(2, len(person.pets.all()))
    
  28. 
    
  29.     def test_prefetch_related_from_uuid_model_to_uuid_model(self):
    
  30.         fleas = [Flea.objects.create() for i in range(3)]
    
  31.         Pet.objects.create(name="Fifi").fleas_hosted.add(*fleas)
    
  32.         Pet.objects.create(name="Bobo").fleas_hosted.add(*fleas)
    
  33. 
    
  34.         with self.assertNumQueries(2):
    
  35.             pet = Pet.objects.prefetch_related("fleas_hosted").get(name="Fifi")
    
  36.         with self.assertNumQueries(0):
    
  37.             self.assertEqual(3, len(pet.fleas_hosted.all()))
    
  38. 
    
  39.         with self.assertNumQueries(2):
    
  40.             flea = Flea.objects.prefetch_related("pets_visited").get(pk=fleas[0].pk)
    
  41.         with self.assertNumQueries(0):
    
  42.             self.assertEqual(2, len(flea.pets_visited.all()))
    
  43. 
    
  44.     def test_prefetch_related_from_uuid_model_to_uuid_model_with_values_flat(self):
    
  45.         pet = Pet.objects.create(name="Fifi")
    
  46.         pet.people.add(
    
  47.             Person.objects.create(name="Ellen"),
    
  48.             Person.objects.create(name="George"),
    
  49.         )
    
  50.         self.assertSequenceEqual(
    
  51.             Pet.objects.prefetch_related("fleas_hosted").values_list("id", flat=True),
    
  52.             [pet.id],
    
  53.         )
    
  54. 
    
  55. 
    
  56. class UUIDPrefetchRelatedLookups(TestCase):
    
  57.     @classmethod
    
  58.     def setUpTestData(cls):
    
  59.         house = House.objects.create(name="Redwood", address="Arcata")
    
  60.         room = Room.objects.create(name="Racoon", house=house)
    
  61.         fleas = [Flea.objects.create(current_room=room) for i in range(3)]
    
  62.         pet = Pet.objects.create(name="Spooky")
    
  63.         pet.fleas_hosted.add(*fleas)
    
  64.         person = Person.objects.create(name="Bob")
    
  65.         person.houses.add(house)
    
  66.         person.pets.add(pet)
    
  67.         person.fleas_hosted.add(*fleas)
    
  68. 
    
  69.     def test_from_uuid_pk_lookup_uuid_pk_integer_pk(self):
    
  70.         # From uuid-pk model, prefetch <uuid-pk model>.<integer-pk model>:
    
  71.         with self.assertNumQueries(4):
    
  72.             spooky = Pet.objects.prefetch_related(
    
  73.                 "fleas_hosted__current_room__house"
    
  74.             ).get(name="Spooky")
    
  75.         with self.assertNumQueries(0):
    
  76.             self.assertEqual("Racoon", spooky.fleas_hosted.all()[0].current_room.name)
    
  77. 
    
  78.     def test_from_uuid_pk_lookup_integer_pk2_uuid_pk2(self):
    
  79.         # From uuid-pk model, prefetch
    
  80.         # <integer-pk model>.<integer-pk model>.<uuid-pk model>.<uuid-pk model>:
    
  81.         with self.assertNumQueries(5):
    
  82.             spooky = Pet.objects.prefetch_related("people__houses__rooms__fleas").get(
    
  83.                 name="Spooky"
    
  84.             )
    
  85.         with self.assertNumQueries(0):
    
  86.             self.assertEqual(
    
  87.                 3,
    
  88.                 len(spooky.people.all()[0].houses.all()[0].rooms.all()[0].fleas.all()),
    
  89.             )
    
  90. 
    
  91.     def test_from_integer_pk_lookup_uuid_pk_integer_pk(self):
    
  92.         # From integer-pk model, prefetch <uuid-pk model>.<integer-pk model>:
    
  93.         with self.assertNumQueries(3):
    
  94.             racoon = Room.objects.prefetch_related("fleas__people_visited").get(
    
  95.                 name="Racoon"
    
  96.             )
    
  97.         with self.assertNumQueries(0):
    
  98.             self.assertEqual("Bob", racoon.fleas.all()[0].people_visited.all()[0].name)
    
  99. 
    
  100.     def test_from_integer_pk_lookup_integer_pk_uuid_pk(self):
    
  101.         # From integer-pk model, prefetch <integer-pk model>.<uuid-pk model>:
    
  102.         with self.assertNumQueries(3):
    
  103.             redwood = House.objects.prefetch_related("rooms__fleas").get(name="Redwood")
    
  104.         with self.assertNumQueries(0):
    
  105.             self.assertEqual(3, len(redwood.rooms.all()[0].fleas.all()))
    
  106. 
    
  107.     def test_from_integer_pk_lookup_integer_pk_uuid_pk_uuid_pk(self):
    
  108.         # From integer-pk model, prefetch
    
  109.         # <integer-pk model>.<uuid-pk model>.<uuid-pk model>:
    
  110.         with self.assertNumQueries(4):
    
  111.             redwood = House.objects.prefetch_related("rooms__fleas__pets_visited").get(
    
  112.                 name="Redwood"
    
  113.             )
    
  114.         with self.assertNumQueries(0):
    
  115.             self.assertEqual(
    
  116.                 "Spooky",
    
  117.                 redwood.rooms.all()[0].fleas.all()[0].pets_visited.all()[0].name,
    
  118.             )