django-bulk-hooks 0.2.32__py3-none-any.whl → 0.2.36__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/bulk_executor.py +55 -9
- {django_bulk_hooks-0.2.32.dist-info → django_bulk_hooks-0.2.36.dist-info}/METADATA +1 -1
- {django_bulk_hooks-0.2.32.dist-info → django_bulk_hooks-0.2.36.dist-info}/RECORD +5 -5
- {django_bulk_hooks-0.2.32.dist-info → django_bulk_hooks-0.2.36.dist-info}/LICENSE +0 -0
- {django_bulk_hooks-0.2.32.dist-info → django_bulk_hooks-0.2.36.dist-info}/WHEEL +0 -0
|
@@ -446,7 +446,26 @@ class BulkExecutor:
|
|
|
446
446
|
|
|
447
447
|
# Determine the correct output field for type casting
|
|
448
448
|
# For ForeignKey fields, use the target field to ensure correct SQL types
|
|
449
|
-
|
|
449
|
+
is_fk = isinstance(field, ForeignKey)
|
|
450
|
+
case_output_field = field.target_field if is_fk else field
|
|
451
|
+
|
|
452
|
+
# DEBUG: Log field information
|
|
453
|
+
logger.info(
|
|
454
|
+
f"DEBUG MTI Update - Field: {field_name}, "
|
|
455
|
+
f"Model: {field_group.model_class.__name__}, "
|
|
456
|
+
f"IsForeignKey: {is_fk}, "
|
|
457
|
+
f"FieldType: {type(field).__name__}, "
|
|
458
|
+
f"OutputFieldType: {type(case_output_field).__name__}, "
|
|
459
|
+
f"FieldClass: {field.__class__.__module__}.{field.__class__.__name__}"
|
|
460
|
+
)
|
|
461
|
+
|
|
462
|
+
if is_fk:
|
|
463
|
+
logger.info(
|
|
464
|
+
f"DEBUG FK Details - Field: {field_name}, "
|
|
465
|
+
f"attname: {field.attname}, "
|
|
466
|
+
f"target_field: {field.target_field}, "
|
|
467
|
+
f"target_field_type: {type(field.target_field).__name__}"
|
|
468
|
+
)
|
|
450
469
|
|
|
451
470
|
for pk, obj in zip(root_pks, plan.objects):
|
|
452
471
|
obj_pk = getattr(obj, "pk", None) or getattr(obj, "id", None)
|
|
@@ -454,17 +473,44 @@ class BulkExecutor:
|
|
|
454
473
|
continue
|
|
455
474
|
|
|
456
475
|
# Get the field value - handle ForeignKey fields specially
|
|
457
|
-
value = getattr(obj, field.attname, None) if
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
476
|
+
value = getattr(obj, field.attname, None) if is_fk else getattr(obj, field_name)
|
|
477
|
+
|
|
478
|
+
# DEBUG: Log value information for first object
|
|
479
|
+
if pk == root_pks[0]:
|
|
480
|
+
logger.info(
|
|
481
|
+
f"DEBUG Value - Field: {field_name}, "
|
|
482
|
+
f"PK: {pk}, "
|
|
483
|
+
f"Value: {value}, "
|
|
484
|
+
f"ValueType: {type(value).__name__}, "
|
|
485
|
+
f"ValueRepr: {repr(value)}"
|
|
486
|
+
)
|
|
487
|
+
|
|
488
|
+
# Handle NULL values specially for ForeignKey fields
|
|
489
|
+
if is_fk and value is None:
|
|
490
|
+
# For ForeignKey fields with None values, use None directly
|
|
491
|
+
# Django handles this as proper NULL with correct type
|
|
492
|
+
when_statements.append(
|
|
493
|
+
When(
|
|
494
|
+
**{field_group.filter_field: pk},
|
|
495
|
+
then=None,
|
|
496
|
+
),
|
|
497
|
+
)
|
|
498
|
+
else:
|
|
499
|
+
# For non-None values or non-FK fields, use Value with output_field
|
|
500
|
+
when_statements.append(
|
|
501
|
+
When(
|
|
502
|
+
**{field_group.filter_field: pk},
|
|
503
|
+
then=Value(value, output_field=case_output_field),
|
|
504
|
+
),
|
|
505
|
+
)
|
|
465
506
|
|
|
466
507
|
if when_statements:
|
|
467
508
|
case_statements[field_name] = Case(*when_statements, output_field=case_output_field)
|
|
509
|
+
logger.info(
|
|
510
|
+
f"DEBUG Case Statement - Field: {field_name}, "
|
|
511
|
+
f"CaseOutputField: {type(case_output_field).__name__}, "
|
|
512
|
+
f"NumWhenStatements: {len(when_statements)}"
|
|
513
|
+
)
|
|
468
514
|
|
|
469
515
|
# Execute bulk update
|
|
470
516
|
if case_statements:
|
|
@@ -13,14 +13,14 @@ django_bulk_hooks/manager.py,sha256=3mFzB0ZzHHeXWdKGObZD_H0NlskHJc8uYBF69KKdAXU,
|
|
|
13
13
|
django_bulk_hooks/models.py,sha256=4Vvi2LiGP0g4j08a5liqBROfsO8Wd_ermBoyjKwfrPU,2512
|
|
14
14
|
django_bulk_hooks/operations/__init__.py,sha256=BtJYjmRhe_sScivLsniDaZmBkm0ZLvcmzXFKL7QY2Xg,550
|
|
15
15
|
django_bulk_hooks/operations/analyzer.py,sha256=8xNdsoeOCHsIIP7ztIuFHDewBR2dDSS6auOrSU8zmqE,9007
|
|
16
|
-
django_bulk_hooks/operations/bulk_executor.py,sha256=
|
|
16
|
+
django_bulk_hooks/operations/bulk_executor.py,sha256=KsNHVkMjFEFdyLwht0wLLay8WfuHZbwHLwUeZeNm6cQ,23703
|
|
17
17
|
django_bulk_hooks/operations/coordinator.py,sha256=iSi-x3fq6_3UygWGeQY8Fq_gZWIqq_8N7WddPhVeygk,23526
|
|
18
18
|
django_bulk_hooks/operations/mti_handler.py,sha256=G-pxkzIqHqXGshRGksqmsN1J3rlzePUZrSv4wm7D3cQ,19162
|
|
19
19
|
django_bulk_hooks/operations/mti_plans.py,sha256=YP7LcV9Z8UqNS_x74OswF9_5swqruRTdAu6z-J_R6C0,3377
|
|
20
20
|
django_bulk_hooks/operations/record_classifier.py,sha256=KzUoAhfoqzFVrOabNZAby9Akb54h-fAQZmb8O-fIx_0,6221
|
|
21
21
|
django_bulk_hooks/queryset.py,sha256=rvJgQLwtSJztwc68nkJ6xwCsnbXQvkvS6_dbGGj8TFo,5886
|
|
22
22
|
django_bulk_hooks/registry.py,sha256=QyeA2OqNdMAMaLjFU9UF0YGhKiPKbZkmFQpLgof7uNs,9038
|
|
23
|
-
django_bulk_hooks-0.2.
|
|
24
|
-
django_bulk_hooks-0.2.
|
|
25
|
-
django_bulk_hooks-0.2.
|
|
26
|
-
django_bulk_hooks-0.2.
|
|
23
|
+
django_bulk_hooks-0.2.36.dist-info/LICENSE,sha256=dguKIcbDGeZD-vXWdLyErPUALYOvtX_fO4Zjhq481uk,1088
|
|
24
|
+
django_bulk_hooks-0.2.36.dist-info/METADATA,sha256=aMOShV8jbI7Fk-ZlBpDlme21jKHRmJWO9X5rnCrMX4Y,9265
|
|
25
|
+
django_bulk_hooks-0.2.36.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
26
|
+
django_bulk_hooks-0.2.36.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|