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 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:
 

  1. Tổng số lượng 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.
     

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:
 

  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 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:
 

  1. pre_save để điều chỉnh tổng số lượng 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 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
 

  1. 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.
     

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

  3. 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
 

  1. 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.
     

  2. 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.
     

  3. 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_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 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!

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.