在新创建的实例的保存方法上访问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)
答
一些评论使用的信号提示。虽然您可以使用信号,尤其是m2m_changed
信号,但每当您修改m2m字段时,它总是会触发。据我所知,发件人模型(在您的示例中,即ItemMembership
)无法知道关联的Order
实例是否刚刚创建。
当然,你也许可以使用cache
框架在调用的Order
对象的save()
设置临时标志,然后读了m2m_changed
信号相同的标志,并删除标志,当它结束了。不利的一面是你必须验证这个过程,并且它的使用信号的目的是去耦合东西。
我的建议是完全删除模型中的所有这些电子邮件发送功能。改为将其作为帮助函数来实现,然后在已成功创建Order
对象及其关联的ItemMembership
对象后,直接调用助手函数。恕我直言,这也使调试更容易。
+0
谢谢你,我会研究这个方向。让你知道。 – user1415785
不,因为多对多的关系*在字面上不能存在*直到一个项目被保存。你如何填充'物品'? –
现在我正在使用Django管理员。我计划稍后在前端制作一个表格。 – user1415785
我想django信号是你在找什么。 看到这个 - > https://docs.djangoproject.com/en/1.10/topics/signals/ –