Coverage for sm / patches.py: 90%
21 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-24 12:43 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-24 12:43 +0000
1import django.core.serializers.base
4def patch_serializers():
5 """
6 Apply patches to django core serializers for better fixture loading.
7 """
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
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)
38 django.core.serializers.base.build_instance = build_instance
41def apply_patches():
42 patch_serializers()