在新创建的实例的保存方法上访问m2m关系

在新创建的实例的保存方法上访问m2m关系

问题描述:

我想在创建订单实例时发送电子邮件(仅限)。在电子邮件模板中,我需要访问m2m关系。不幸的是,它看起来像是m2m关系尚未填充,而itemmembership_set.all()方法返回一个空列表。在新创建的实例的保存方法上访问m2m关系

这里是我的代码:

class Item(models.Model): 
    ... 

class Order(models.Model): 
    ... 
    items = models.ManyToManyField(Item, through='ItemMembership') 

    def save(self, *args, **kwargs): 
     pk = self.pk 

     super(Order, self).save(*args, **kwargs) 

     # If the instance is beeing created, sends an email with the order 
     # details. 
     if not pk: 
      self.send_details_email() 

    def send_details_email(self): 
     assert len(self.itemmembership_set.all()) != 0 

class ItemMembership(models.Model): 
    order = models.ForeignKey(Order) 
    item = models.ForeignKey(Item) 
    quantity = models.PositiveSmallIntegerField(default=1) 
+0

不,因为多对多的关系*在字面上不能存在*直到一个项目被保存。你如何填充'物品'? –

+0

现在我正在使用Django管理员。我计划稍后在前端制作一个表格。 – user1415785

+1

我想django信号是你在找什么。 看到这个 - > https://docs.djangoproject.com/en/1.10/topics/signals/ –

一些评论使用的信号提示。虽然您可以使用信号,尤其是m2m_changed信号,但每当您修改m2m字段时,它总是会触发。据我所知,发件人模型(在您的示例中,即ItemMembership)无法知道关联的Order实例是否刚刚创建。

当然,你也许可以使用cache框架在调用的Order对象的save()设置临时标志,然后读了m2m_changed信号相同的标志,并删除标志,当它结束了。不利的一面是你必须验证这个过程,并且它的使用信号的目的是去耦合东西。

我的建议是完全删除模型中的所有这些电子邮件发送功能。改为将其作为帮助函数来实现,然后在已成功创建Order对象及其关联的ItemMembership对象后,直接调用助手函数。恕我直言,这也使调试更容易。

+0

谢谢你,我会研究这个方向。让你知道。 – user1415785