python / expert
Snippet
Django Signal Handler with Transaction Atomic
Django signals enable decoupled communication between components. This expert pattern uses post_save to trigger actions after an order is created. The transaction.atomic context manager ensures that all database operations succeed or fail together, preventing partial updates like confirming an order without reserving stock. The check for product stock prevents overselling in a concurrent environment.
snippet.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from django.db import models, transactionfrom django.db.models.signals import post_savefrom django.dispatch import receiverfrom django.core.mail import send_mailfrom django.conf import settings@receiver(post_save, sender='orders.Order')def order_created_handler(sender, instance, created, **kwargs):if not created:returnwith transaction.atomic(savepoint=True):order = instanceorder.status = 'confirmed'order.save(update_fields=['status', 'updated_at'])for item in order.items.select_related('product'):product = item.productproduct.stock -= item.quantityif product.stock < 0:raise ValueError(f'Insufficient stock for {product.name}')product.save(update_fields=['stock'])send_mail(subject=f'Order #{order.id} Confirmed',message=f'Your order has been confirmed and is being processed.',from_email=settings.DEFAULT_FROM_EMAIL,recipient_list=[order.customer.email],fail_silently=False,)
django
Breakdown
1
@receiver(post_save, sender='orders.Order')
Registers the signal receiver for the Order model's post_save event
2
if not created: return
Skips processing for updates, only handles new order creation
3
with transaction.atomic(savepoint=True):
Wraps all database changes in a transaction with savepoint support
4
update_fields=['status', 'updated_at']
Updates only specific columns to avoid full row locks and trigger less code
5
select_related('product')
Prevents N+1 queries when accessing product from each order item
6
if product.stock < 0: raise ValueError(...)
Business rule enforcement within the atomic transaction