2009-08-03 37 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()方法。

重写覆盖...