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

How to Use Django pre_save and post_save Signals Effectively
How to Use Django pre_save and post_save Signals Effectively

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_savepost_save, đặc biệt, 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 instance model vào cơ sở dữ liệu. Các 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 kho. Mỗi khi một sản phẩm được thêm vào hoặc cập nhật:
 

  1. Tổng số sản phẩm trong kho phải được cập nhật tự động.
     
  2. 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.
     

Luồng công việc này đảm bảo 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 Model

 

Chúng ta sẽ bắt đầu bằng cách tạo hai model:
 

  1. Warehouse: Lưu trữ tổng số lượng tất cả các sản phẩm.
     
  2. Product: Đại diện cho các sản phẩm riêng lẻ được liên kết với một 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 Signals để tự động hóa

 

Chúng ta sẽ sử dụng hai tín hiệu:
 

  1. pre_save để điều chỉnh tổng số sản phẩm của kho trước khi lưu.
     
  2. 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 cạn kiệt với chỉ còn {instance.quantity} mặt hàng. 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 Signals

 

Đả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 signals

 

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ố 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 cạn kiệt với chỉ còn 5 mặt hàng."

 

Lợi ích của phương pháp này

 

  1. Tự động hóa

    Tổng số kho và cảnh báo hàng tồn kho thấp được xử lý tự động, loại bỏ nhu cầu cập nhật thủ công.
     

  2. 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 vấn đề nghiêm trọng, đảm bảo hoạt động trơn tru.
     

  3. Logic tách rời

    Signals giữ cho 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 để sử dụng Django Signals

 

  1. Tránh Logic phức tạp

    Giữ cho 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.
     

  2. Giảm thiểu chi phí sử dụng Signals

    Đảm bảo signals 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.
     

  3. Kiểm thử hành vi của Signals

    Kiểm thử kỹ lưỡng để đảm bảo signals kích hoạt như mong muốn 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_savepost_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 signals có thể sắp xếp hợp lý việc quản lý kho bằng cách tự động cập nhật tổng số 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!

 

Tag list:
- Django signal for product quantity updates
- Django pre_save post_save use cases
- How to use Django signals
- Automate inventory workflows Django
- Low stock email notification Django
- Best practices for Django signals
- Django signals tutorial
- Real-world Django signal case study
- Django pre_save signal
- Automate tasks with Django signals
- Django warehouse inventory management
- Django post_save signal
- Using Django signals effectively
- Warehouse product management Django
- Django signal example

Liên quan

Python Learning

Đọc thêm
Django rest framework Django

Đọc thêm

Theo dõi

Theo dõi bản tin của chúng tôi và không bao giờ bỏ lỡ những tin tức mới nhất.