Cách sử dụng tín hiệu pre_save và post_save của Django hiệu quả
By khoanc, at: 20:01 Ngày 15 tháng 3 năm 2025
Thời gian đọc ước tính: __READING_TIME__ minutes


Django signals là một công cụ mạnh mẽ để tách rời logic trong ứng dụng của bạn. Các tín hiệu pre_save
và post_save
, đặc biệt là, cho phép các nhà phát triển thực thi các hành động tùy chỉnh trước hoặc sau khi lưu một thể hiện mô hình vào cơ sở dữ liệu. Những tín hiệu này rất lý tưởng để tự động hóa các tác vụ, giảm sự can thiệp thủ công và duy trì mã sạch hơn.
Trong bài đăng trên blog này, chúng tôi sẽ khám phá cách sử dụng các tín hiệu này một cách hiệu quả bằng cách trình bày một nghiên cứu trường hợp thực tế: quản lý kho hàng và gửi thông báo hàng tồn kho thấp.
Nghiên cứu trường hợp thực tế: Quản lý kho hàng thông minh
Kịch bản
Hãy tưởng tượng bạn đang xây dựng một hệ thống quản lý kho hàng cho một nhà kho. Mỗi khi một sản phẩm được thêm vào hoặc cập nhật:
- Tổng số lượng sản phẩm trong kho phải được cập nhật tự động.
- Nếu số lượng sản phẩm giảm xuống dưới ngưỡng, chủ kho phải được thông báo qua email để ngăn ngừa tình trạng thiếu hàng.
Quy trình làm việc này đảm bảo nhà kho hoạt động hiệu quả, loại bỏ việc theo dõi thủ công và ngăn ngừa tình trạng thiếu hàng.
Triển khai
Bước 1: Định nghĩa các mô hình
Chúng ta sẽ bắt đầu bằng cách tạo hai mô hình:
- Warehouse: Lưu trữ tổng số lượng tất cả các sản phẩm.
- Product: Đại diện cho các sản phẩm riêng lẻ được liên kết với một nhà kho.
from django.db import models
class Warehouse(models.Model):
name = models.CharField(max_length=255)
total_products = models.PositiveIntegerField(default=0)
def __str__(self):
return self.name
class Product(models.Model):
name = models.CharField(max_length=255)
quantity = models.PositiveIntegerField(default=0)
warehouse = models.ForeignKey(Warehouse, on_delete=models.CASCADE, related_name="products")
def __str__(self):
return self.name
Bước 2: Kết nối tín hiệu để tự động hóa
Chúng ta sẽ sử dụng hai tín hiệu:
pre_save
để điều chỉnh tổng số lượng sản phẩm của kho trước khi lưu.
post_save
để gửi thông báo email nếu số lượng sản phẩm thấp.
from django.db.models.signals import pre_save, post_save
from django.dispatch import receiver
from django.core.mail import send_mail
from .models import Product, Warehouse
@receiver(pre_save, sender=Product)
def update_total_products(sender, instance, **kwargs):
if instance.pk:
# Lấy số lượng cũ từ cơ sở dữ liệu
old_quantity = Product.objects.get(pk=instance.pk).quantity
difference = instance.quantity - old_quantity
else:
difference = instance.quantity
# Cập nhật tổng số lượng sản phẩm của kho
instance.warehouse.total_products += difference
instance.warehouse.save()
@receiver(post_save, sender=Product)
def send_low_stock_notification(sender, instance, **kwargs):
low_stock_threshold = 10 # Ngưỡng hàng tồn kho thấp
if instance.quantity < low_stock_threshold:
# Gửi thông báo email đến chủ sở hữu
send_mail(
subject=f"Cảnh báo hàng tồn kho thấp: {instance.name}",
message=f"Sản phẩm '{instance.name}' đang sắp hết với chỉ còn {instance.quantity} sản phẩm. Vui lòng bổ sung hàng sớm.",
from_email="[email protected]",
recipient_list=["[email protected]"], # Thay thế bằng email của chủ kho
)
Bước 3: Đăng ký các tín hiệu
Đảm bảo các tín hiệu được đăng ký khi ứng dụng sẵn sàng bằng cách nhập chúng vào tệp apps.py
.
# apps.py
from django.apps import AppConfig
class InventoryConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "inventory"
def ready(self):
import inventory.signals # Nhập tín hiệu
Kiểm thử hệ thống
Thêm một sản phẩm mới
Tạo một sản phẩm mới và xác minh tổng số lượng sản phẩm của kho được cập nhật tự động.
warehouse = Warehouse.objects.create(name="Main Warehouse")
product = Product.objects.create(name="Widget", quantity=20, warehouse=warehouse)
print(warehouse.total_products) # Kết quả: 20
Cập nhật số lượng sản phẩm
Cập nhật số lượng sản phẩm và đảm bảo tổng số lượng kho phản ánh sự thay đổi.
product.quantity = 35
product.save()
print(warehouse.total_products) # Kết quả: 35
Thông báo hàng tồn kho thấp
Giảm số lượng sản phẩm xuống dưới ngưỡng và kiểm tra thông báo email.
product.quantity = 5
product.save()
# Email đã gửi: "Sản phẩm 'Widget' đang sắp hết với chỉ còn 5 sản phẩm."
Lợi ích của phương pháp này
-
Tự động hóa
Tổng số lượng kho và cảnh báo hàng tồn kho thấp được xử lý tự động, loại bỏ sự cần thiết phải cập nhật thủ công.
-
Thông báo chủ động
Chủ sở hữu được thông báo về hàng tồn kho thấp trước khi nó trở thành một vấn đề nghiêm trọng, đảm bảo hoạt động trơn tru.
-
Logic tách rời
Signals giữ logic kho riêng biệt với ứng dụng cốt lõi, làm cho hệ thống mô đun hơn và dễ bảo trì hơn.
Thực tiễn tốt nhất khi sử dụng tín hiệu Django Signals
-
Tránh logic phức tạp
Giữ các trình xử lý tín hiệu đơn giản. Đối với các tác vụ nặng như gửi email, hãy xem xét sử dụng hàng đợi tác vụ nền như Celery.
-
Giảm thiểu chi phí tín hiệu
Đảm bảo tín hiệu không thực hiện các truy vấn cơ sở dữ liệu không cần thiết hoặc làm chậm xử lý yêu cầu.
-
Kiểm thử hành vi tín hiệu
Kiểm tra kỹ lưỡng để đảm bảo tín hiệu kích hoạt như mong đợi và không can thiệp vào các phần khác của ứng dụng.
Kết luận
Các tín hiệu pre_save
và post_save
của Django là những công cụ tuyệt vời để tự động hóa quy trình làm việc và giữ cho logic ứng dụng của bạn sạch sẽ. Trong nghiên cứu trường hợp này, chúng tôi đã chỉ ra cách các tín hiệu có thể hợp lý hóa việc quản lý kho bằng cách tự động cập nhật tổng số lượng kho và thông báo cho chủ sở hữu về hàng tồn kho thấp.
Bằng cách triển khai các kỹ thuật này, bạn có thể xây dựng các hệ thống thông minh hơn, hiệu quả hơn, tiết kiệm thời gian và ngăn ngừa các lỗi tốn kém.
Sẵn sàng tối ưu hóa ứng dụng Django của bạn? Bắt đầu tận dụng signals ngay hôm nay!