Django:保存多个对象信号一次

时间:2009-12-21 02:56:13

标签: django signals

我需要一些帮助,在下订单时发送电子邮件。为了说明问题,以下是抽象代码:

class Order(models.Model):
    user = models.ForeignKey(User)

class OrderItem(modes.Model):
    order = models.ForeignKey(Order, related_name='items')
    item = models.CharField(max_length=255)
    unit_price = models.DecimalField()
    qty = models.IntegerField()
    item_amount = models.DecimalField()

def email_order_on_save(sender, instance, **kwargs):
    # Need order.items.all() here
    pass

post_save.connect(email_order_on_save, sender=Order)

SO和谷歌上的大多数问题似乎一次只处理一个子对象; such as this

如果从管理内联中保存了5个订单项,则收听OrderItem将释放5个信号。我似乎无法理解这个问题。有一种方法,我认为(不确定,如果可能的话)可能会听取最后一个(5)OrderItem的post_save信号。

任何帮助表示感谢。

4 个答案:

答案 0 :(得分:3)

我猜你试图在错误的地方解决这个问题。在订单完成时发送电子邮件并保存订单模型处于不同的抽象级别。

我认为发送电子邮件应该由视图中的某些条件触发,该条件包含有关订单是否已完全保存的更多信息。想想如果订单需要更新会发生什么(比如它的状态变化)?那电子邮件也应该发送吗?

答案 1 :(得分:1)

创建您自己的custom signal并在您需要保存数据时发送它。作为参数传入您需要的任何数据结构。

回调函数email_order_on_save中的

Listen for your custom signal,并根据发送或不发送电子邮件的参数做出适当的决定。

答案 2 :(得分:1)

您可以按如下方式创建模型

ORDER_STATE = (
    (1, 'Completed'),
    (2, 'Processing'),
)

class Order(models.Model):
    user = models.ForeignKey(User)
    state = models.IntegerField(choices = ORDER_STATE)

订单可能有很多州。状态“已完成”可表示订单处理已完成。您可以在视图中更改订单状态。

在信号处理程序中,您可以检查订单的状态,然后在订单处于完成状态时发送邮件。

答案 3 :(得分:0)

我认为您可能遇到信号问题,带有内联的OrderItem不会发送保存信号,请阅读this