簡體   English   中英

為什么Django post_save信號給我pre_save數據?

[英]Why does Django post_save signal give me pre_save data?

我試圖將“信息”對象連接到許多“客戶”(參見下面的代碼)

當一個Information對象更新時,我想向連接到Information的每個Customer發送電子郵件。

但是,當我記錄信號收到的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)

編輯:#django中的apollo13提醒我:“相關項目(被保存為多對多關系的東西)不會像你發現的那樣保存為模型的保存方法的一部分。” - http://groups.google.com/group/django-users/msg/2b734c153537f970

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

有一個開放的票,你所面臨的問題在這里 您可以密切關注它何時進入發行版,或者您可以嘗試應用它提供的補丁,看看是否有幫助。

這是我的解決方案,在應用上面提到的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

我遇到了同樣的問題,因為我的模型中有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()方法。

快樂壓倒一切......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM