Hook-style hooks for Django bulk operations like bulk_create and bulk_update.
Project description
django-bulk-hooks
⚡ Bulk hooks for Django bulk operations and individual model lifecycle events.
django-bulk-hooks brings a declarative, hook-like experience to Django's bulk_create, bulk_update, and bulk_delete — including support for BEFORE_ and AFTER_ hooks, conditions, batching, and transactional safety. It also provides comprehensive lifecycle hooks for individual model operations.
✨ Features
- Declarative hook system:
@hook(AFTER_UPDATE, condition=...) - BEFORE/AFTER hooks for create, update, delete
- Hook-aware manager that wraps Django's
bulk_operations - NEW:
HookModelMixinfor individual model lifecycle events - Hook chaining, hook deduplication, and atomicity
- Class-based hook handlers with DI support
- Support for both bulk and individual model operations
🚀 Quickstart
pip install django-bulk-hooks
Define Your Model
from django.db import models
from django_bulk_hooks.models import HookModelMixin
class Account(HookModelMixin):
balance = models.DecimalField(max_digits=10, decimal_places=2)
# The HookModelMixin automatically provides BulkHookManager
Create a Hook Handler
from django_bulk_hooks import hook, AFTER_UPDATE, Hook
from django_bulk_hooks.conditions import WhenFieldHasChanged
from .models import Account
class AccountHooks(HookHandler):
@hook(AFTER_UPDATE, model=Account, condition=WhenFieldHasChanged("balance"))
def log_balance_change(self, new_records, old_records):
print("Accounts updated:", [a.pk for a in new_records])
@hook(BEFORE_CREATE, model=Account)
def before_create(self, new_records, old_records):
for account in new_records:
if account.balance < 0:
raise ValueError("Account cannot have negative balance")
@hook(AFTER_DELETE, model=Account)
def after_delete(self, new_records, old_records):
print("Accounts deleted:", [a.pk for a in old_records])
Advanced Hook Usage
class AdvancedAccountHooks(HookHandler):
@hook(BEFORE_UPDATE, model=Account, condition=WhenFieldHasChanged("balance"))
def validate_balance_change(self, new_records, old_records):
for new_account, old_account in zip(new_records, old_records):
if new_account.balance < 0 and old_account.balance >= 0:
raise ValueError("Cannot set negative balance")
@hook(AFTER_CREATE, model=Account)
def send_welcome_email(self, new_records, old_records):
for account in new_records:
# Send welcome email logic here
pass
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file django_bulk_hooks-0.1.80.tar.gz.
File metadata
- Download URL: django_bulk_hooks-0.1.80.tar.gz
- Upload date:
- Size: 10.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.12.10 Windows/11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
75f98a36a553df132cf9262dad76e15b2f1313f1c861ec8690760dd1735b1d6d
|
|
| MD5 |
3b32d51570d5dfe2d40647b5597ec669
|
|
| BLAKE2b-256 |
530191d014ce99492368850fcf1e0cfb225f031c71d0f7e161483c12f903537c
|
File details
Details for the file django_bulk_hooks-0.1.80-py3-none-any.whl.
File metadata
- Download URL: django_bulk_hooks-0.1.80-py3-none-any.whl
- Upload date:
- Size: 14.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.12.10 Windows/11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
542c0e1597a9308421c41afcd8a79436912279e9420307ddc7116e82a96f7e02
|
|
| MD5 |
b9c7caa681ab3974646f8ac48bba52af
|
|
| BLAKE2b-256 |
556c9333306d43599e3d67edd3fb2963c228c5123e6a2536d40a55869d39a32c
|