2008-10-04 33 views
61

Tôi đang gặp khó khăn khi quấn đầu quanh cái này. Ngay bây giờ tôi có một số kiểu máy trông giống như thế này:Tín hiệu Django so với phương pháp lưu đè trọng

def Review(models.Model) 
    ...fields... 
    overall_score = models.FloatField(blank=True) 

def Score(models.Model) 
    review = models.ForeignKey(Review) 
    question = models.TextField() 
    grade = models.IntegerField() 

Đánh giá có một số "điểm", điểm số trung bình là điểm số trung bình. Khi một đánh giá hoặc một số điểm được lưu, tôi cần phải tính toán lại mức trung bình tổng thể_score. Ngay bây giờ tôi đang sử dụng một phương pháp lưu ghi đè. Sẽ có bất kỳ lợi ích nào khi sử dụng bộ điều phối tín hiệu của Django?

Trả lời

67

Tín hiệu lưu/xóa thường thuận lợi trong các trường hợp bạn cần thực hiện thay đổi không hoàn toàn cụ thể cho mô hình được đề cập hoặc có thể áp dụng cho các mô hình có điểm chung hoặc có thể được định cấu hình để sử dụng mô hình.

Một nhiệm vụ phổ biến trong các phương pháp được ghi đè save là tạo các sên tự động từ một số trường văn bản trong một mô hình. Đó là một ví dụ về cái gì đó, nếu bạn cần thực hiện nó cho một số mô hình, sẽ được hưởng lợi từ việc sử dụng tín hiệu pre_save, nơi bộ xử lý tín hiệu có thể lấy tên của trường sên và tên của trường để tạo ra sên từ . Khi bạn có thứ gì đó tương tự như vậy, mọi chức năng nâng cao mà bạn đưa ra cũng sẽ áp dụng cho tất cả các kiểu máy - ví dụ: tìm kiếm con sên mà bạn sắp thêm vào cho kiểu mô hình được đề cập, để đảm bảo tính duy nhất.

ứng dụng

Reusable thường được hưởng lợi từ việc sử dụng các tín hiệu - nếu các chức năng mà họ cung cấp có thể được áp dụng cho bất kỳ mô hình, họ thường (trừ khi nó là không thể tránh khỏi) sẽ không muốn người dùng phải trực tiếp chỉnh sửa mô hình của mình để được hưởng lợi từ nó.

Với django-mptt, ví dụ, tôi đã sử dụng tín hiệu pre_save để quản lý một tập hợp các lĩnh vực trong đó mô tả một cấu trúc cây cho mô hình đó là về để được tạo ra hoặc cập nhật và pre_delete tín hiệu để loại bỏ các chi tiết cấu trúc cây cho đối tượng là đã xóa và toàn bộ cây con của đối tượng trước nó và chúng sẽ bị xóa. Do sử dụng tín hiệu, người dùng không phải thêm hoặc sửa đổi các phương thức save hoặc delete trên mô hình của họ để thực hiện quản lý này cho họ, họ chỉ cần cho phép django-mptt biết họ muốn quản lý mô hình nào.

3

Nếu bạn sử dụng tín hiệu, bạn có thể cập nhật Điểm đánh giá mỗi lần mô hình điểm số liên quan được lưu. Nhưng nếu không cần chức năng như vậy tôi không thấy bất kỳ lý do để đưa điều này vào tín hiệu, đó là khá liên quan đến công cụ mô hình.

2

Đó là một loại loại biến đổi. Nhìn vào đây pretty solution. Định nghĩa trường thành phần tại chỗ.

-20

Tín hiệu hữu ích khi bạn phải thực hiện một số quy trình dài hạn và không muốn chặn người dùng của mình đang chờ lưu để hoàn tất.

+8

Không, tín hiệu chặn trừ khi bạn đẻ trứng đề một cách rõ ràng. – muhuk

+8

@muhuk là đúng, tín hiệu chặn quá trình của bạn. Nếu bạn muốn tránh các quá trình bị chặn, hãy sử dụng các công cụ như gevent, cần tây hoặc các công cụ không đồng bộ khác. – pydanny

+1

Tôi cho nó một -1 vì các điểm của muhuk và pydanny. Dường như đó là lời khuyên hoàn toàn sai lầm. Yêu cầu sẽ không kết thúc cho đến khi xử lý tín hiệu được thực hiện. Vì vậy, cần tây có vẻ như một giải pháp tốt, đó là những gì tôi thường sử dụng trong các dự án django của tôi. –

11

Bạn hỏi:

Nên có bất kỳ lợi ích khi sử dụng phối tín hiệu của Django?

Tôi thấy điều này trong các tài liệu django:

phương pháp mô hình ghi đè không được gọi vào hoạt động với số lượng lớn

Lưu ý rằng phương pháp() xóa cho một đối tượng không nhất thiết phải gọi đối tượng khi xóa với số lượng lớn bằng cách sử dụng QuerySet hoặc do xóa tầng.Để đảm bảo logic xóa tùy chỉnh được thực thi, bạn có thể sử dụng các tín hiệu pre_delete và/hoặc post_delete.

Thật không may, không có giải pháp nào khi tạo hoặc cập nhật đối tượng hàng loạt vì không có lưu(), pre_save và post_save nào được gọi là được gọi.

Từ: Overriding predefined model methods

+2

Chế độ xem danh sách quản trị Django sử dụng xóa hàng loạt ... đã bị nhầm lẫn cho đến khi xuất hiện miếng ngon này. –

+0

nó cũng nói "Thật không may, không có cách giải quyết khi tạo hoặc cập nhật đối tượng hàng loạt vì không có lưu(), pre_save và post_save nào được gọi." - vì vậy tôi không nghĩ đây là một sự cân bằng giữa các phương pháp này. – Cory

Các vấn đề liên quan