我需要一些帮助,在下订单时发送电子邮件。为了说明问题,以下是抽象代码:
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信号。
任何帮助表示感谢。
答案 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