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

2024-10-01 04:44:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我想发送电子邮件(仅)当订单实例创建。在电子邮件模板中,我需要访问m2m关系。不幸的是,它似乎还没有填充m2m关系,并且itemmembership_全部设置()方法返回空列表。在

这是我的代码:

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)

Tags: selfmodel关系models电子邮件emaildeforder
1条回答
网友
1楼 · 发布于 2024-10-01 04:44:43

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

当然,您可以使用cache框架在调用Order对象的save()时设置一个临时标志,然后在m2m_changed信号上读取相同的标志,并在结束时删除该标志。缺点是你必须验证这个过程,而且它超出了使用信号的目的,这就是去耦合东西。在

我的建议是完全删除所有这些电子邮件发送功能从您的模型。改为将其实现为一个helper函数,然后在成功创建Order对象及其关联的ItemMembership对象后显式地调用helper函数。IMHO,它也使调试变得容易得多。在

相关问题 更多 >