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.
- django_bulk_hooks/operations/mti_handler.py +23 -3
- {django_bulk_hooks-0.2.53.dist-info → django_bulk_hooks-0.2.55.dist-info}/METADATA +1 -1
- {django_bulk_hooks-0.2.53.dist-info → django_bulk_hooks-0.2.55.dist-info}/RECORD +5 -5
- {django_bulk_hooks-0.2.53.dist-info → django_bulk_hooks-0.2.55.dist-info}/LICENSE +0 -0
- {django_bulk_hooks-0.2.53.dist-info → django_bulk_hooks-0.2.55.dist-info}/WHEEL +0 -0
|
@@ -193,8 +193,12 @@ class MTIHandler:
|
|
|
193
193
|
if existing_pks_map is None:
|
|
194
194
|
existing_pks_map = {}
|
|
195
195
|
|
|
196
|
-
#
|
|
197
|
-
|
|
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
|
|
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__)
|
|
@@ -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=
|
|
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.
|
|
25
|
-
django_bulk_hooks-0.2.
|
|
26
|
-
django_bulk_hooks-0.2.
|
|
27
|
-
django_bulk_hooks-0.2.
|
|
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,,
|
|
File without changes
|
|
File without changes
|