@@ -415,3 +415,48 @@ def test_models_from_cursor_generator_efficiency(
415
415
416
416
assert not next (instances_generator , None )
417
417
assert cursor .rownumber == 2
418
+
419
+
420
+ @pytest .mark .skipif (
421
+ django .VERSION < (3 , 1 ),
422
+ reason = django_31_skip_reason ,
423
+ )
424
+ def test_models_from_cursor_tolerates_additional_columns (
425
+ mocked_model_foreign_keys , mocked_model_varying_fields
426
+ ):
427
+ with connection .cursor () as cursor :
428
+ cursor .execute (
429
+ f"ALTER TABLE { mocked_model_foreign_keys ._meta .db_table } ADD COLUMN new_col text DEFAULT NULL"
430
+ )
431
+ cursor .execute (
432
+ f"ALTER TABLE { mocked_model_varying_fields ._meta .db_table } ADD COLUMN new_col text DEFAULT NULL"
433
+ )
434
+
435
+ instance = mocked_model_foreign_keys .objects .create (
436
+ varying_fields = mocked_model_varying_fields .objects .create (
437
+ title = "test" , updated_at = timezone .now ()
438
+ ),
439
+ single_field = None ,
440
+ )
441
+
442
+ with connection .cursor () as cursor :
443
+ cursor .execute (
444
+ f"""
445
+ SELECT fk_t.*, vf_t.* FROM { mocked_model_foreign_keys ._meta .db_table } fk_t
446
+ INNER JOIN { mocked_model_varying_fields ._meta .db_table } vf_t ON vf_t.id = fk_t.varying_fields_id
447
+ """
448
+ )
449
+
450
+ queried_instances = list (
451
+ models_from_cursor (
452
+ mocked_model_foreign_keys ,
453
+ cursor ,
454
+ related_fields = ["varying_fields" ],
455
+ )
456
+ )
457
+
458
+ assert len (queried_instances ) == 1
459
+ assert queried_instances [0 ].id == instance .id
460
+ assert (
461
+ queried_instances [0 ].varying_fields .id == instance .varying_fields .id
462
+ )
0 commit comments