django-bulk-hooks 0.1.124__tar.gz → 0.1.126__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of django-bulk-hooks might be problematic. Click here for more details.
- {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.126}/PKG-INFO +1 -1
- {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.126}/django_bulk_hooks/queryset.py +15 -37
- {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.126}/pyproject.toml +1 -1
- {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.126}/LICENSE +0 -0
- {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.126}/README.md +0 -0
- {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.126}/django_bulk_hooks/__init__.py +0 -0
- {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.126}/django_bulk_hooks/conditions.py +0 -0
- {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.126}/django_bulk_hooks/constants.py +0 -0
- {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.126}/django_bulk_hooks/context.py +0 -0
- {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.126}/django_bulk_hooks/decorators.py +0 -0
- {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.126}/django_bulk_hooks/engine.py +0 -0
- {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.126}/django_bulk_hooks/enums.py +0 -0
- {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.126}/django_bulk_hooks/handler.py +0 -0
- {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.126}/django_bulk_hooks/manager.py +0 -0
- {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.126}/django_bulk_hooks/models.py +0 -0
- {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.126}/django_bulk_hooks/priority.py +0 -0
- {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.126}/django_bulk_hooks/registry.py +0 -0
|
@@ -298,12 +298,13 @@ class HookQuerySet(models.QuerySet):
|
|
|
298
298
|
def _process_mti_batch(self, batch, inheritance_chain, **kwargs):
|
|
299
299
|
"""
|
|
300
300
|
Process a single batch of objects through the inheritance chain.
|
|
301
|
+
Reuses Django's internal functions as much as possible.
|
|
301
302
|
"""
|
|
302
|
-
#
|
|
303
|
+
# For MTI, we need to save parent objects first to get PKs
|
|
304
|
+
# Then we can use Django's bulk_create for the child objects
|
|
303
305
|
parent_objects_map = {}
|
|
304
306
|
|
|
305
|
-
#
|
|
306
|
-
parent_objects_by_model = {}
|
|
307
|
+
# Step 1: Save parent objects (we need their PKs for child objects)
|
|
307
308
|
for obj in batch:
|
|
308
309
|
parent_instances = {}
|
|
309
310
|
current_parent = None
|
|
@@ -311,55 +312,31 @@ class HookQuerySet(models.QuerySet):
|
|
|
311
312
|
parent_obj = self._create_parent_instance(
|
|
312
313
|
obj, model_class, current_parent
|
|
313
314
|
)
|
|
315
|
+
# Use Django's internal save method to avoid hooks
|
|
316
|
+
models.Model.save(parent_obj)
|
|
314
317
|
parent_instances[model_class] = parent_obj
|
|
315
318
|
current_parent = parent_obj
|
|
316
|
-
|
|
317
|
-
# Group by model class for potential bulk operations
|
|
318
|
-
if model_class not in parent_objects_by_model:
|
|
319
|
-
parent_objects_by_model[model_class] = []
|
|
320
|
-
parent_objects_by_model[model_class].append(parent_obj)
|
|
321
|
-
|
|
322
319
|
parent_objects_map[id(obj)] = parent_instances
|
|
323
320
|
|
|
324
|
-
#
|
|
325
|
-
for model_class, parent_objs in parent_objects_by_model.items():
|
|
326
|
-
if len(parent_objs) > 1:
|
|
327
|
-
# Use bulk_create for multiple objects of the same model
|
|
328
|
-
model_class._base_manager.bulk_create(parent_objs)
|
|
329
|
-
else:
|
|
330
|
-
# Individual save for single objects
|
|
331
|
-
super(parent_objs[0].__class__, parent_objs[0]).save()
|
|
332
|
-
# Step 2: Bulk insert for child objects
|
|
321
|
+
# Step 2: Create and save child objects
|
|
333
322
|
child_model = inheritance_chain[-1]
|
|
334
|
-
|
|
323
|
+
created = []
|
|
335
324
|
for obj in batch:
|
|
336
325
|
child_obj = self._create_child_instance(
|
|
337
326
|
obj, child_model, parent_objects_map.get(id(obj), {})
|
|
338
327
|
)
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
# We use super().save() to avoid triggering hooks that would cause recursion.
|
|
345
|
-
created = []
|
|
346
|
-
for child_obj in child_objects:
|
|
347
|
-
# Use the base model's save method to avoid triggering hooks
|
|
348
|
-
# This prevents infinite recursion when hooks try to query the database
|
|
349
|
-
super(child_obj.__class__, child_obj).save()
|
|
350
|
-
created.append(child_obj)
|
|
351
|
-
else:
|
|
352
|
-
# Single-table, safe to use bulk_create
|
|
353
|
-
|
|
354
|
-
child_manager = child_model._base_manager
|
|
355
|
-
child_manager._for_write = True
|
|
356
|
-
created = child_manager.bulk_create(child_objects, **kwargs)
|
|
328
|
+
# Save child object individually since Django's bulk_create doesn't support MTI
|
|
329
|
+
# Use Django's Model.save() directly to avoid hooks but get proper field handling
|
|
330
|
+
models.Model.save(child_obj)
|
|
331
|
+
created.append(child_obj)
|
|
332
|
+
|
|
357
333
|
# Step 3: Update original objects with generated PKs and state
|
|
358
334
|
pk_field_name = child_model._meta.pk.name
|
|
359
335
|
for orig_obj, child_obj in zip(batch, created):
|
|
360
336
|
setattr(orig_obj, pk_field_name, getattr(child_obj, pk_field_name))
|
|
361
337
|
orig_obj._state.adding = False
|
|
362
338
|
orig_obj._state.db = self.db
|
|
339
|
+
|
|
363
340
|
return batch
|
|
364
341
|
|
|
365
342
|
def _create_parent_instance(self, source_obj, parent_model, current_parent):
|
|
@@ -423,3 +400,4 @@ class HookQuerySet(models.QuerySet):
|
|
|
423
400
|
field.pre_save(child_obj, add=True)
|
|
424
401
|
|
|
425
402
|
return child_obj
|
|
403
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "django-bulk-hooks"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.126"
|
|
4
4
|
description = "Hook-style hooks for Django bulk operations like bulk_create and bulk_update."
|
|
5
5
|
authors = ["Konrad Beck <konrad.beck@merchantcapital.co.za>"]
|
|
6
6
|
readme = "README.md"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|