Coverage for sm / patches.py: 90%

21 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-03-24 12:43 +0000

1import django.core.serializers.base 

2 

3 

4def patch_serializers(): 

5 """ 

6 Apply patches to django core serializers for better fixture loading. 

7 """ 

8 

9 # Patch build_instance to handle RelatedObjectDoesNotExist during 

10 # natural key resolution. This makes fixture loading more robust. 

11 def build_instance(Model, data, db): 

12 default_manager = Model._meta.default_manager 

13 pk = data.get(Model._meta.pk.attname) 

14 if ( 

15 pk is None 

16 and hasattr(default_manager, "get_by_natural_key") 

17 and hasattr(Model, "natural_key") 

18 ): 

19 obj = Model(**data) 

20 obj._state.db = db 

21 try: 

22 # This call is sensitive to related objects not being loaded yet 

23 natural_key = obj.natural_key() 

24 except Exception: 

25 natural_key = None 

26 

27 if natural_key: 

28 try: 

29 data[Model._meta.pk.attname] = Model._meta.pk.to_python( 

30 default_manager.db_manager(db) 

31 .get_by_natural_key(*natural_key) 

32 .pk 

33 ) 

34 except Exception: 

35 pass 

36 return Model(**data) 

37 

38 django.core.serializers.base.build_instance = build_instance 

39 

40 

41def apply_patches(): 

42 patch_serializers()