2013-07-08 53 views
0

我正在開發django中的電子商務。 的問題是關於訂單和RowOrder計算:當關系中的所有對象都保存在django中時觸發事件(發送郵件)

class Order(Model): 
    STATUS = { 
     'NPAI': 'Not paid', 
     'PAID': 'Paid', 
     'SHIP': 'Shipped', 
    } 
    status = CharField(max_length=4, choices=STATUS.items(), editable=False, default='NPAI') 
    cod = CharField(max_length=30, unique=True, db_index=True, editable=False) 

    total_price = DecimalField(max_digits=4, decimal_places=2, default=Decimal('0.00'), editable=False) 
    vat = DecimalField(max_digits=4, decimal_places=2, default=Decimal('0.00'), editable=False) 
    [...] 

class RowOrder(Model): 
    article = ForeignKey(Article) 
    order = ForeignKey(Order) 
    [...] 
    def save(self, *args, **kwargs): 
     # update order 
     with transaction.commit_on_success(): 
      order_Locked = Order.objects.select_for_update().get(id=self.order.id) 
      order_Locked.total_price += self.price 
      order_Locked.vat_price += self.price - self.price/(1 + order_Locked.vat/100) 
      order_Locked.save() 

正如你所看到的,我更新爲了的值每次roworder保存。這種運作良好,但現在我已經創建訂單時發送訂單確認電子郵件,但如果我發送電子郵件在Order.save():

def save(self, *args, **kwargs): 
     if self.status == 'NPAI': 
      super(Order, self).save(*args, **kwargs) 
      send_order_confirm(self) 

那麼,正確的是,在self.roworder_set那個時間是空的。 我選擇了一種錯誤的方法,或者實際上我有什麼可以做的來實現我的目標?非常感謝。

回答

0

由於AKSHAR raaj意見,我認爲我已經解決了我的問題:

我已經觸發事件從Django的管理,而不是模型:

class OrderAdmin(ModelAdmin): 

    [...] 

    def save_formset(self, request, form, formset, change): 
     super(OrderAdmin, self).save_formset(request, form, formset, change) 
     order = formset.instance 
     if order.status == 'NPAI': 
      send_order_confirm(order) 

useful link to the django official doc

清楚,如果我需要一個事件從視圖I C在視圖中直接調用send_order_confirm

0

您應該在此訂購上使用post_save。另外,你要發送的電子郵件,只有當訂單被創建,所以:

def send_order_confirmation(sender, **kwargs): 
    created = kwargs['created'] 
    if created: 
     #logic for sending email 

post_save.connect(send_order_confirmation, sender=Order) 
+0

謝謝您的回答,但不是,它不起作用。事實上,post_save在Order.save()之後被觸發,並且在那個時候,不存在任何roworder對象(yet) –

+0

不確定,那麼你的用例是那麼。是的,我同意這個特定順序沒有roworder訂單創建時可用。 –

+0

當我發送郵件時,我希望roworder對象實際存在 –

相關問題