django-bulk-hooks 0.1.124__py3-none-any.whl → 0.1.126__py3-none-any.whl

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.

@@ -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,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
- # 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 save child objects
333
322
  child_model = inheritance_chain[-1]
334
- child_objects = []
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
- 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)
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
  Metadata-Version: 2.3
2
2
  Name: django-bulk-hooks
3
- Version: 0.1.124
3
+ Version: 0.1.126
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
@@ -9,9 +9,9 @@ django_bulk_hooks/handler.py,sha256=xZt8iNdYF-ACz-MnKMY0co6scWINU5V5wC1lyDn844k,
9
9
  django_bulk_hooks/manager.py,sha256=r54ct3S6AcqME2OsX-jPF944CEKcoSIW3qiAx_NwUaw,2801
10
10
  django_bulk_hooks/models.py,sha256=7RG7GrOdHXFjGVPV4FPRZVNMIHHW-hMCi6hn9LH_hVI,3331
11
11
  django_bulk_hooks/priority.py,sha256=HG_2D35nga68lBCZmSXTcplXrjFoRgZFRDOy4ROKonY,376
12
- django_bulk_hooks/queryset.py,sha256=RpPaATYlJR6mCoxwCKUcVPH0Wr0Rwl51yF9FDjTT4TQ,17433
12
+ django_bulk_hooks/queryset.py,sha256=yiuUG-vNoDffSV074V1H1gYauvjThIEB-fEeMBARA0Y,16099
13
13
  django_bulk_hooks/registry.py,sha256=-mQBizJ06nz_tajZBinViKx_uP2Tbc1tIpTEMv7lwKA,705
14
- django_bulk_hooks-0.1.124.dist-info/LICENSE,sha256=dguKIcbDGeZD-vXWdLyErPUALYOvtX_fO4Zjhq481uk,1088
15
- django_bulk_hooks-0.1.124.dist-info/METADATA,sha256=Ul83KdLsZ_wvBSeVQJkG2Mf_HHg5Ckjrck5dVIwZ0FU,6951
16
- django_bulk_hooks-0.1.124.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
17
- django_bulk_hooks-0.1.124.dist-info/RECORD,,
14
+ django_bulk_hooks-0.1.126.dist-info/LICENSE,sha256=dguKIcbDGeZD-vXWdLyErPUALYOvtX_fO4Zjhq481uk,1088
15
+ django_bulk_hooks-0.1.126.dist-info/METADATA,sha256=uUk97wc8yGCxM8nh9aevKqCZpIj9dh_USbXTkVQ0K_o,6951
16
+ django_bulk_hooks-0.1.126.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
17
+ django_bulk_hooks-0.1.126.dist-info/RECORD,,