2009-08-03 81 views
9

我試着去一個「信息」對象連接到許多「客戶」(見下面的代碼)爲什麼Django post_save信號會給我pre_save數據?

當一個對象的信息更新,我想將電子郵件發送到連接到信息每一位客戶。

但是,當我登錄信號收到的sold_to字段時,我總是得到保存之前的數據。

我猜這是因爲它的ManyToManyField和數據存儲在一個單獨的表中,但不應該在所有關係更新後調用post_save信號?

任何人都有一個解決方案的建議?

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) 

編輯:apollo13在#django提醒我這一點: 「有關的項目(的東西被保存到許多一對多的關係) 不會被保存爲模型的保存方法的一部分,因爲你已經發現了。「 - http://groups.google.com/group/django-users/msg/2b734c153537f970

但自從2006年7月9日以來,我真的很希望有一個解決方案。

回答

5

對於您所面臨的問題,有一張開放票here。你可以在它發佈的時候留意它,或者你可以嘗試應用它提供的補丁,看看是否有幫助。

+0

感謝您的快速回復。我嘗試了這個補丁,經過一些黑客攻擊後,我開始工作。下面將發佈解決方案。 – schmilblick 2009-08-04 09:09:12

1

這是我的解決方案,應用了上面提到的code.djangoproject.com的補丁。

添加了這個在models.py:

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

而且send_admin_email功能:

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

我遇到了同樣的問題跑,因爲我有M2M領域在我的模型我也得到了類似pre_save數據。

在這種情況下,問題是在M2M字段中,爲了獲得自動生成的ID,應該保存兩個相關模型。

在我的解決方案中,我既沒有使用post_save信號,也沒有使用m2m_changed信號,而是使用了ModelAdmin類定義中的log_addition和log_change方法。

在您的自定義的ModelAdmin類:

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 

如果你願意,你也可以覆蓋log_deletion()方法。

重寫覆蓋...