django-bulk-hooks 0.2.53__py3-none-any.whl → 0.2.55__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.

@@ -193,8 +193,12 @@ class MTIHandler:
193
193
  if existing_pks_map is None:
194
194
  existing_pks_map = {}
195
195
 
196
- # For upsert operations, don't set PKs on source objects - let Django's bulk_create handle it
197
- # The PKs will be set on the resulting objects after the bulk operation
196
+ # Set PKs on existing objects so they can be updated
197
+ if existing_pks_map:
198
+ for obj in objs:
199
+ if id(obj) in existing_pks_map:
200
+ obj.pk = existing_pks_map[id(obj)]
201
+ obj.id = existing_pks_map[id(obj)]
198
202
 
199
203
  # Build parent levels
200
204
  parent_levels = self._build_parent_levels(
@@ -357,6 +361,13 @@ class MTIHandler:
357
361
 
358
362
  # Copy field values from source using centralized field extraction
359
363
  for field in parent_model._meta.local_fields:
364
+ # Skip AutoField (primary key) - let Django's bulk_create with update_conflicts
365
+ # handle PK assignment based on unique_fields. Setting PKs manually here causes
366
+ # conflicts when parent records exist but update_conflicts isn't properly configured
367
+ # for this level, leading to IntegrityError on primary key constraint.
368
+ if isinstance(field, AutoField):
369
+ continue
370
+
360
371
  if hasattr(source_obj, field.name):
361
372
  # Use centralized field value extraction for consistent FK handling
362
373
  value = get_field_value_for_db(source_obj, field.name, source_obj.__class__)
@@ -402,7 +413,12 @@ class MTIHandler:
402
413
  """
403
414
  child_obj = child_model()
404
415
 
405
- # Copy field values (excluding AutoField and parent links)
416
+ # Copy field values (excluding AutoField, parent links, and inherited fields)
417
+ # In MTI, child objects should only have values for fields defined directly on the child model
418
+ parent_fields = set()
419
+ for parent_model in child_model._meta.parents.keys():
420
+ parent_fields.update(f.name for f in parent_model._meta.local_fields)
421
+
406
422
  for field in child_model._meta.local_fields:
407
423
  if isinstance(field, AutoField):
408
424
  continue
@@ -413,6 +429,10 @@ class MTIHandler:
413
429
  if child_model._meta.get_ancestor_link(field.related_model) == field:
414
430
  continue
415
431
 
432
+ # Skip inherited fields - these belong to parent models
433
+ if field.name in parent_fields:
434
+ continue
435
+
416
436
  if hasattr(source_obj, field.name):
417
437
  # Use centralized field value extraction for consistent FK handling
418
438
  value = get_field_value_for_db(source_obj, field.name, source_obj.__class__)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: django-bulk-hooks
3
- Version: 0.2.53
3
+ Version: 0.2.55
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
@@ -16,12 +16,12 @@ django_bulk_hooks/operations/analyzer.py,sha256=wAG8sAG9NwfwNqG9z81VfGR7AANDzRmM
16
16
  django_bulk_hooks/operations/bulk_executor.py,sha256=tMbcwQSN8xNoKL7-KC8m-XhGyqwaAtAQ5CAm3PYHl_Q,24122
17
17
  django_bulk_hooks/operations/coordinator.py,sha256=iGavJLqe3eYRqFay8cMn6muwyRYzQo-HFGphsS5hL6g,30799
18
18
  django_bulk_hooks/operations/field_utils.py,sha256=Tvr5bcZLG8imH-r2S85oui1Cbw6hGv3VtuIMn4OvsU4,2895
19
- django_bulk_hooks/operations/mti_handler.py,sha256=SpDe2fKfFgYfRxhimYfu-d1f4g34luXDoGb8oRR0abI,20549
19
+ django_bulk_hooks/operations/mti_handler.py,sha256=ZR4Bps0lPdT9syrk-AMdqsxFN34QRJVqH1peR_E4h0s,21550
20
20
  django_bulk_hooks/operations/mti_plans.py,sha256=7STQ2oA2ZT8cEG3-t-6xciRAdf7OeSf0gRLXR_BRG-Q,3363
21
21
  django_bulk_hooks/operations/record_classifier.py,sha256=kqML4aO11X9K3SSJ5DUlUukwI172j_Tk12Kr77ee8q8,7065
22
22
  django_bulk_hooks/queryset.py,sha256=aQitlbexcVnmeAdc0jtO3hci39p4QEu4srQPEzozy5s,5546
23
23
  django_bulk_hooks/registry.py,sha256=uum5jhGI3TPaoiXuA1MdBdu4gbE3rQGGwQ5YDjiMcjk,7949
24
- django_bulk_hooks-0.2.53.dist-info/LICENSE,sha256=dguKIcbDGeZD-vXWdLyErPUALYOvtX_fO4Zjhq481uk,1088
25
- django_bulk_hooks-0.2.53.dist-info/METADATA,sha256=0DsfhnU5TezxhZ1z3-it4KNalYb2aAhuaHqsLKqCWaU,9265
26
- django_bulk_hooks-0.2.53.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
27
- django_bulk_hooks-0.2.53.dist-info/RECORD,,
24
+ django_bulk_hooks-0.2.55.dist-info/LICENSE,sha256=dguKIcbDGeZD-vXWdLyErPUALYOvtX_fO4Zjhq481uk,1088
25
+ django_bulk_hooks-0.2.55.dist-info/METADATA,sha256=2goa-ou7_Q77g-z_GnbCWyhV5Tp7WUhiQFbURMBTOX0,9265
26
+ django_bulk_hooks-0.2.55.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
27
+ django_bulk_hooks-0.2.55.dist-info/RECORD,,