2009-08-03 23 views
9

Tôi đang cố gắng kết nối đối tượng "Thông tin" với nhiều "Khách hàng" (xem mã bên dưới)Tại sao tín hiệu Django post_save cho tôi dữ liệu pre_save?

Khi một đối tượng Thông tin được cập nhật, tôi muốn gửi email đến từng Khách hàng được kết nối với Thông tin.

Tuy nhiên, khi tôi đăng nhập trường sold_to mà tín hiệu nhận được, tôi luôn nhận được dữ liệu giống như trước khi lưu.

Tôi đoán điều này là do ManyToManyField của nó và dữ liệu được lưu trữ trong một bảng riêng biệt, nhưng không nên tín hiệu post_save được gọi sau khi tất cả các mối quan hệ đã được cập nhật?

Bất kỳ ai có đề xuất về giải pháp?

class Customer 
    name = models.CharField(max_length=200) 
    category = models.ManyToManyField('Category',symmetrical=False) 
    contact = models.EmailField() 

class Information 
    name = models.CharField(max_length=200) 
    email = models.EmailField(max_length=200) 
    mod_date = models.DateTimeField(auto_now=True) 
    sold_to = models.ManyToManyField(Customer, null=True, blank=True) 


def send_admin_email(sender, instance, signal, *args, **kwargs): 
    from myapp import settings 
    for cust in instance.sold_to.all(): 
     settings.debug(cust.name) 

post_save.connect(send_admin_email, sender=Information) 

Edit: apollo13 trong #django cảnh báo cho tôi như thế này: "mặt hàng liên quan (những điều được lưu vào mối quan hệ nhiều-nhiều) sẽ không được lưu như là một phần của một mô hình của phương pháp tiết kiệm, như bạn đã được khám phá." - http://groups.google.com/group/django-users/msg/2b734c153537f970

Nhưng kể từ ngày 9 tháng 7 năm 2006, tôi thực sự thực sự hy vọng có giải pháp cho việc này.

Trả lời

5

Có một vé mở cho sự cố bạn đang gặp phải here. Bạn có thể theo dõi điều đó khi nó biến nó thành bản phát hành, hoặc bạn có thể thử áp dụng bản vá mà nó cung cấp và xem nó có giúp ích gì không.

+0

Cảm ơn bạn đã trả lời nhanh. Tôi đã thử các bản vá, và sau một chút hack tôi đã nhận nó để làm việc. Sẽ đăng giải pháp dưới đây. – schmilblick

1

Đây là giải pháp của tôi, sau khi áp dụng bản vá từ code.djangoproject.com được đề cập ở trên.

gia tăng này trong models.py:

from django.db.models.signals import m2m_changed 
m2m_changed.connect(send_admin_email, sender=Information) 

Và chức năng send_admin_email:

def send_customer_email(sender, instance, action, model, field_name, reverse, objects, **kwargs): 
    if ("add" == action): 
     # do stuff 
1

tôi chạy trên cùng một vấn đề kể từ khi tôi có các trường M2M trong mô hình của tôi, tôi cũng có những pre_save như dữ liệu.

Trong trường hợp, sự cố là trong trường M2M, cả hai mô hình liên quan đều phải được lưu để nhận ID được tạo tự động. Trong giải pháp của tôi, tôi không sử dụng tín hiệu post_save hay tín hiệu m2m_changed, thay vì các tín hiệu đó, tôi đã sử dụng phương thức log_addition và log_change trong định nghĩa lớp ModelAdmin.

Trong lớp ModelAdmin tùy chỉnh của bạn:

class CustomModelAdmin(admin.ModelAdmin): 
     def log_addition(self, request, object): 
     """ 
     Log that an object has been successfully added. 
     """ 
      super(CustomModelAdmin, self).log_addition(request, object) 
      #call post_save callback here object created 

     def log_change(self, request, object): 
     """ 
     Log that an object has been successfully changed. 
     """ 
      super(CustomModelAdmin, self).log_change(request, object) 
      #call post_save callback here object changed 

Nếu bạn muốn, bạn cũng có thể ghi đè phương pháp log_deletion().

Chúc mừng ghi đè ...

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