django-bulk-hooks 0.1.124__tar.gz → 0.1.125__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.

Files changed (17) hide show
  1. {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.125}/PKG-INFO +1 -1
  2. {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.125}/django_bulk_hooks/queryset.py +15 -35
  3. {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.125}/pyproject.toml +1 -1
  4. {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.125}/LICENSE +0 -0
  5. {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.125}/README.md +0 -0
  6. {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.125}/django_bulk_hooks/__init__.py +0 -0
  7. {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.125}/django_bulk_hooks/conditions.py +0 -0
  8. {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.125}/django_bulk_hooks/constants.py +0 -0
  9. {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.125}/django_bulk_hooks/context.py +0 -0
  10. {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.125}/django_bulk_hooks/decorators.py +0 -0
  11. {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.125}/django_bulk_hooks/engine.py +0 -0
  12. {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.125}/django_bulk_hooks/enums.py +0 -0
  13. {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.125}/django_bulk_hooks/handler.py +0 -0
  14. {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.125}/django_bulk_hooks/manager.py +0 -0
  15. {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.125}/django_bulk_hooks/models.py +0 -0
  16. {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.125}/django_bulk_hooks/priority.py +0 -0
  17. {django_bulk_hooks-0.1.124 → django_bulk_hooks-0.1.125}/django_bulk_hooks/registry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: django-bulk-hooks
3
- Version: 0.1.124
3
+ Version: 0.1.125
4
4
  Summary: Hook-style hooks for Django bulk operations like bulk_create and bulk_update.
5
5
  License: MIT
6
6
  Keywords: django,bulk,hooks
@@ -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
- # Step 1: Handle parent tables with bulk operations where possible
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
- # Group parent objects by model class to enable bulk operations
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,25 +312,13 @@ 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
- # Save parent objects in bulk where possible
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 bulk insert child objects
333
322
  child_model = inheritance_chain[-1]
334
323
  child_objects = []
335
324
  for obj in batch:
@@ -337,29 +326,19 @@ class HookQuerySet(models.QuerySet):
337
326
  obj, child_model, parent_objects_map.get(id(obj), {})
338
327
  )
339
328
  child_objects.append(child_obj)
340
- # If the child model is still MTI, we need to handle it specially
341
- if len([p for p in child_model._meta.parents.keys() if not p._meta.proxy]) > 0:
342
- # For nested MTI, we can't use bulk operations recursively
343
- # because it would create infinite recursion. Instead, we save each child individually.
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)
329
+
330
+ # Use Django's bulk_create for child objects - this handles auto_now_add correctly
331
+ child_manager = child_model._base_manager
332
+ child_manager._for_write = True
333
+ created = child_manager.bulk_create(child_objects, **kwargs)
334
+
357
335
  # Step 3: Update original objects with generated PKs and state
358
336
  pk_field_name = child_model._meta.pk.name
359
337
  for orig_obj, child_obj in zip(batch, created):
360
338
  setattr(orig_obj, pk_field_name, getattr(child_obj, pk_field_name))
361
339
  orig_obj._state.adding = False
362
340
  orig_obj._state.db = self.db
341
+
363
342
  return batch
364
343
 
365
344
  def _create_parent_instance(self, source_obj, parent_model, current_parent):
@@ -423,3 +402,4 @@ class HookQuerySet(models.QuerySet):
423
402
  field.pre_save(child_obj, add=True)
424
403
 
425
404
  return child_obj
405
+
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "django-bulk-hooks"
3
- version = "0.1.124"
3
+ version = "0.1.125"
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"