django-bulk-hooks 0.2.27__tar.gz → 0.2.29__tar.gz
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-0.2.27 → django_bulk_hooks-0.2.29}/PKG-INFO +1 -1
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/bulk_executor.py +6 -39
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/pyproject.toml +1 -1
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/LICENSE +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/README.md +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/__init__.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/changeset.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/conditions.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/constants.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/context.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/decorators.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/dispatcher.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/enums.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/factory.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/handler.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/helpers.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/manager.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/models.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/__init__.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/analyzer.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/coordinator.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/mti_handler.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/mti_plans.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/record_classifier.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/queryset.py +0 -0
- {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/registry.py +0 -0
{django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/bulk_executor.py
RENAMED
|
@@ -7,7 +7,7 @@ This service coordinates bulk database operations with validation and MTI handli
|
|
|
7
7
|
import logging
|
|
8
8
|
|
|
9
9
|
from django.db import transaction
|
|
10
|
-
from django.db.models import AutoField
|
|
10
|
+
from django.db.models import AutoField, ForeignKey
|
|
11
11
|
|
|
12
12
|
logger = logging.getLogger(__name__)
|
|
13
13
|
|
|
@@ -455,58 +455,25 @@ class BulkExecutor:
|
|
|
455
455
|
case_statements = {}
|
|
456
456
|
for field_name in field_group.fields:
|
|
457
457
|
field = field_group.model_class._meta.get_field(field_name)
|
|
458
|
-
|
|
459
|
-
# Use column name for FK fields
|
|
460
|
-
if getattr(field, "is_relation", False) and hasattr(field, "attname"):
|
|
461
|
-
db_field_name = field.attname
|
|
462
|
-
# For FK fields, use the actual target field from the relationship
|
|
463
|
-
# This ensures proper type casting for the database column
|
|
464
|
-
if hasattr(field, "target_field"):
|
|
465
|
-
target_field = field.target_field
|
|
466
|
-
else:
|
|
467
|
-
# Fallback: create a field that matches the FK column type
|
|
468
|
-
from django.db.models import BigIntegerField
|
|
469
|
-
target_field = BigIntegerField()
|
|
470
|
-
|
|
471
|
-
logger.debug(f"FK field {field_name} -> column {db_field_name}, target_field: {target_field}")
|
|
472
|
-
else:
|
|
473
|
-
db_field_name = field_name
|
|
474
|
-
target_field = field
|
|
475
|
-
|
|
476
458
|
when_statements = []
|
|
459
|
+
|
|
477
460
|
for pk, obj in zip(root_pks, plan.objects):
|
|
478
461
|
obj_pk = getattr(obj, "pk", None) or getattr(obj, "id", None)
|
|
479
462
|
if obj_pk is None:
|
|
480
463
|
continue
|
|
481
464
|
|
|
482
|
-
value
|
|
483
|
-
|
|
484
|
-
# For FK fields, ensure we get the actual ID value, not the related object
|
|
485
|
-
if getattr(field, "is_relation", False) and hasattr(field, "attname"):
|
|
486
|
-
# If value is a model instance, get its pk
|
|
487
|
-
if value is not None and hasattr(value, "pk"):
|
|
488
|
-
value = value.pk
|
|
489
|
-
# If value is a string representation of an ID, convert to int
|
|
490
|
-
elif value is not None and isinstance(value, str):
|
|
491
|
-
if value.isdigit():
|
|
492
|
-
value = int(value)
|
|
493
|
-
elif value == "":
|
|
494
|
-
value = None
|
|
495
|
-
|
|
496
|
-
# Create the Value expression with proper type casting
|
|
497
|
-
value_expr = Value(value, output_field=target_field)
|
|
465
|
+
# Get the field value - handle ForeignKey fields specially
|
|
466
|
+
value = getattr(obj, field.attname, None) if isinstance(field, ForeignKey) else getattr(obj, field_name)
|
|
498
467
|
|
|
499
468
|
when_statements.append(
|
|
500
469
|
When(
|
|
501
470
|
**{field_group.filter_field: pk},
|
|
502
|
-
then=
|
|
471
|
+
then=Value(value, output_field=field),
|
|
503
472
|
),
|
|
504
473
|
)
|
|
505
474
|
|
|
506
475
|
if when_statements:
|
|
507
|
-
case_statements[
|
|
508
|
-
*when_statements, output_field=target_field,
|
|
509
|
-
)
|
|
476
|
+
case_statements[field_name] = Case(*when_statements, output_field=field)
|
|
510
477
|
|
|
511
478
|
# Execute bulk update
|
|
512
479
|
if case_statements:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/__init__.py
RENAMED
|
File without changes
|
{django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/analyzer.py
RENAMED
|
File without changes
|
{django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/coordinator.py
RENAMED
|
File without changes
|
{django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/mti_handler.py
RENAMED
|
File without changes
|
{django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/mti_plans.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|