mirror of
https://github.com/django/django.git
synced 2025-08-31 07:47:37 +00:00
Fixed #15250 -- Avoided extra query on some multi-table inheritance queries.
Thanks marekw2143 for the initial patch and carljm for support.
This commit is contained in:
parent
9899347641
commit
38575b007a
4 changed files with 74 additions and 15 deletions
|
@ -496,3 +496,35 @@ class ModelInheritanceTest(TestCase):
|
|||
r.supplier_set.all(),
|
||||
[s], lambda x: x,
|
||||
)
|
||||
|
||||
def test_queries_on_parent_access(self):
|
||||
italian_restaurant = ItalianRestaurant.objects.create(
|
||||
name="Guido's House of Pasta",
|
||||
address='944 W. Fullerton',
|
||||
serves_hot_dogs=True,
|
||||
serves_pizza=False,
|
||||
serves_gnocchi=True,
|
||||
)
|
||||
|
||||
# No queries are made when accessing the parent objects.
|
||||
italian_restaurant = ItalianRestaurant.objects.get(pk=italian_restaurant.pk)
|
||||
with self.assertNumQueries(0):
|
||||
restaurant = italian_restaurant.restaurant_ptr
|
||||
self.assertEqual(restaurant.place_ptr.restaurant, restaurant)
|
||||
self.assertEqual(restaurant.italianrestaurant, italian_restaurant)
|
||||
|
||||
# One query is made when accessing the parent objects when the instance
|
||||
# is deferred.
|
||||
italian_restaurant = ItalianRestaurant.objects.only('serves_gnocchi').get(pk=italian_restaurant.pk)
|
||||
with self.assertNumQueries(1):
|
||||
restaurant = italian_restaurant.restaurant_ptr
|
||||
self.assertEqual(restaurant.place_ptr.restaurant, restaurant)
|
||||
self.assertEqual(restaurant.italianrestaurant, italian_restaurant)
|
||||
|
||||
# No queries are made when accessing the parent objects when the
|
||||
# instance has deferred a field not present in the parent table.
|
||||
italian_restaurant = ItalianRestaurant.objects.defer('serves_gnocchi').get(pk=italian_restaurant.pk)
|
||||
with self.assertNumQueries(0):
|
||||
restaurant = italian_restaurant.restaurant_ptr
|
||||
self.assertEqual(restaurant.place_ptr.restaurant, restaurant)
|
||||
self.assertEqual(restaurant.italianrestaurant, italian_restaurant)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue