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.

@@ -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
- case_output_field = field.target_field if isinstance(field, ForeignKey) else field
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 isinstance(field, ForeignKey) else getattr(obj, field_name)
458
-
459
- when_statements.append(
460
- When(
461
- **{field_group.filter_field: pk},
462
- then=Value(value, output_field=case_output_field),
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:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: django-bulk-hooks
3
- Version: 0.2.32
3
+ Version: 0.2.36
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
@@ -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=Aqnnr3RqDh4KJgZz-mQBlAl8ScZE3NhMC2gqdAxcm-4,21224
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.32.dist-info/LICENSE,sha256=dguKIcbDGeZD-vXWdLyErPUALYOvtX_fO4Zjhq481uk,1088
24
- django_bulk_hooks-0.2.32.dist-info/METADATA,sha256=SPBG50Vgbab8Lo8bqOI4luL0tU_JZRMsWPgUVwz2eN0,9265
25
- django_bulk_hooks-0.2.32.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
26
- django_bulk_hooks-0.2.32.dist-info/RECORD,,
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,,