[英]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.