@@ -619,6 +619,43 @@ def settings_customise_sources(
619619 assert s .bar == 'env setting'
620620
621621
622+ def test_env_deep_override (env ):
623+ class DeepSubModel (BaseModel ):
624+ v4 : str
625+
626+ class SubModel (BaseModel ):
627+ v1 : str
628+ v2 : bytes
629+ v3 : int
630+ deep : DeepSubModel
631+
632+ class Settings (BaseSettings , env_nested_delimiter = '__' ):
633+ v0 : str
634+ sub_model : SubModel
635+
636+ @classmethod
637+ def settings_customise_sources (
638+ cls , settings_cls , init_settings , env_settings , dotenv_settings , file_secret_settings
639+ ):
640+ return env_settings , dotenv_settings , init_settings , file_secret_settings
641+
642+ env .set ('SUB_MODEL__DEEP__V4' , 'override-v4' )
643+
644+ s_final = {'v0' : '0' , 'sub_model' : {'v1' : 'init-v1' , 'v2' : b'init-v2' , 'v3' : 3 , 'deep' : {'v4' : 'override-v4' }}}
645+
646+ s = Settings (v0 = '0' , sub_model = {'v1' : 'init-v1' , 'v2' : b'init-v2' , 'v3' : 3 , 'deep' : {'v4' : 'init-v4' }})
647+ assert s .model_dump () == s_final
648+
649+ s = Settings (v0 = '0' , sub_model = SubModel (v1 = 'init-v1' , v2 = b'init-v2' , v3 = 3 , deep = DeepSubModel (v4 = 'init-v4' )))
650+ assert s .model_dump () == s_final
651+
652+ s = Settings (v0 = '0' , sub_model = SubModel (v1 = 'init-v1' , v2 = b'init-v2' , v3 = 3 , deep = {'v4' : 'init-v4' }))
653+ assert s .model_dump () == s_final
654+
655+ s = Settings (v0 = '0' , sub_model = {'v1' : 'init-v1' , 'v2' : b'init-v2' , 'v3' : 3 , 'deep' : DeepSubModel (v4 = 'init-v4' )})
656+ assert s .model_dump () == s_final
657+
658+
622659def test_config_file_settings_nornir (env ):
623660 """
624661 See https://github.com/pydantic/pydantic/pull/341#issuecomment-450378771
0 commit comments