@@ -619,6 +619,43 @@ def settings_customise_sources(
619
619
assert s .bar == 'env setting'
620
620
621
621
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
+
622
659
def test_config_file_settings_nornir (env ):
623
660
"""
624
661
See https://github.com/pydantic/pydantic/pull/341#issuecomment-450378771
0 commit comments