@@ -415,3 +415,48 @@ def test_models_from_cursor_generator_efficiency(
415415
416416 assert not next (instances_generator , None )
417417 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