@@ -2376,6 +2376,43 @@ def test_bulk_add_remove(self):
2376
2376
historical_place = m2m_record .places .first ()
2377
2377
self .assertEqual (historical_place .place , self .place )
2378
2378
2379
+ def test_add_remove_set_and_clear_methods_make_expected_num_queries (self ):
2380
+ for num_places in (1 , 2 , 4 ):
2381
+ with self .subTest (num_places = num_places ):
2382
+ start_pk = 100 + num_places
2383
+ places = Place .objects .bulk_create (
2384
+ Place (pk = pk , name = f"Place { pk } " )
2385
+ for pk in range (start_pk , start_pk + num_places )
2386
+ )
2387
+ self .assertEqual (len (places ), num_places )
2388
+ self .assertEqual (self .poll .places .count (), 0 )
2389
+
2390
+ # The number of queries should stay the same, regardless of
2391
+ # the number of places added or removed
2392
+ with self .assertNumQueries (5 ):
2393
+ self .poll .places .add (* places )
2394
+ self .assertEqual (self .poll .places .count (), num_places )
2395
+
2396
+ with self .assertNumQueries (3 ):
2397
+ self .poll .places .remove (* places )
2398
+ self .assertEqual (self .poll .places .count (), 0 )
2399
+
2400
+ with self .assertNumQueries (6 ):
2401
+ self .poll .places .set (places )
2402
+ self .assertEqual (self .poll .places .count (), num_places )
2403
+
2404
+ with self .assertNumQueries (4 ):
2405
+ self .poll .places .set ([])
2406
+ self .assertEqual (self .poll .places .count (), 0 )
2407
+
2408
+ with self .assertNumQueries (5 ):
2409
+ self .poll .places .add (* places )
2410
+ self .assertEqual (self .poll .places .count (), num_places )
2411
+
2412
+ with self .assertNumQueries (3 ):
2413
+ self .poll .places .clear ()
2414
+ self .assertEqual (self .poll .places .count (), 0 )
2415
+
2379
2416
def test_m2m_relation (self ):
2380
2417
# Ensure only the correct M2Ms are saved and returned for history objects
2381
2418
poll_2 = PollWithManyToMany .objects .create (question = "Why" , pub_date = today )
0 commit comments