2016-09-14 11 views
0

Orderインスタンスが作成されたときに電子メールを送信したい(唯一の)。電子メールテンプレートでは、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

いいえ、アイテムが保存されるまで多対多の関係が文字通り存在しないためです。あなたはどのように 'items'を投入していますか? –

+0

今私はDjango管理者を使用しています。私は後でフロントエンドでフォームを作るつもりです。 – user1415785

+1

私はあなたが探しているdjango SIGNALSだと思います。 これを参照してください - > https://docs.djangoproject.com/en/1.10/topics/signals/ –

答えて

1

一部は、信号を使用して提案しました。シグナル、特にm2m_changedシグナルを使用することができますが、これはm2mフィールドを変更するたびに常に発生します。私の知る限りでは、関連付けられたOrderインスタンスが作成されたばかりかどうかを、送信者モデル(サンプル内ではItemMembership)が知る方法はありません。

確かに、あなたはおそらくm2m_changed信号に同じフラグを読み、その後、Orderオブジェクトのsave()を呼び出すときに、一時的なフラグを設定するcacheフレームワークを使用して、それが終わった時にフラグを削除することができます。欠点は、プロセスを検証しなければならないことです。信号を使用する目的を打ち負かすのは、信号を分離することです。

あなたのモデルからすべてのメール送信機能を完全に削除することをお勧めします。その代わりにヘルパー関数として実装し、関連付けられたItemMembershipオブジェクトを持つOrderオブジェクトが正常に作成された後、ヘルパー関数を明示的に呼び出すだけです。 IMHOは、デバッグをもっと簡単にします。

+0

ありがとう、私はこの方向に見ていきます。あなたに知らせる。 – user1415785

関連する問題