2016-09-14 47 views
0

我想在創建訂單實例時發送電子郵件(僅限)。在電子郵件模板中,我需要訪問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) 
+0

不,因爲多對多的關係*在字面上不能存在*直到一個項目被保存。你如何填充'物品'? –

+0

現在我正在使用Django管理員。我計劃稍後在前端製作一個表格。 – user1415785

+1

我想django信號是你在找什麼。 看到這個 - > https://docs.djangoproject.com/en/1.10/topics/signals/ –

回答

1

一些評論使用的信號提示。雖然您可以使用信號,尤其是m2m_changed信號,但每當您修改m2m字段時,它總是會觸發。據我所知,發件人模型(在您的示例中,即ItemMembership)無法知道關聯的Order實例是否剛剛創建。

當然,你也許可以使用cache框架在調用的Order對象的save()設置臨時標誌,然後讀了m2m_changed信號相同的標誌,並刪除標誌,當它結束了。不利的一面是你必須驗證這個過程,並且它的使用信號的目的是去耦合東西。

我的建議是完全刪除模型中的所有這些電子郵件發送功能。改爲將其作爲幫助函數來實現,然後在已成功創建Order對象及其關聯的ItemMembership對象後,直接調用助手函數。恕我直言,這也使調試更容易。

+0

謝謝你,我會研究這個方向。讓你知道。 – user1415785