9

「情報」オブジェクトを多くの「顧客」に接続しようとしています(以下のコードを参照)

1 つの情報オブジェクトが更新されたら、その情報に接続されている各顧客に電子メールを送信したいと考えています。

ただし、信号が受信したsold_toフィールドをログに記録すると、保存前のデータが常に取得されます。

これは、その ManyToManyField とデータが別のテーブルに格納されているためだと思いますが、すべてのリレーションが更新された後に post_save シグナルを呼び出すべきではありませんか?

誰かが解決策の提案を受けましたか?

class Customer
    name = models.CharField(max_length=200)
    category = models.ManyToManyField('Category',symmetrical=False)
    contact = models.EmailField()

class Information
    name = models.CharField(max_length=200)
    email = models.EmailField(max_length=200)
    mod_date = models.DateTimeField(auto_now=True)
    sold_to = models.ManyToManyField(Customer, null=True, blank=True)


def send_admin_email(sender, instance, signal, *args, **kwargs):
    from myapp import settings
    for cust in instance.sold_to.all():
        settings.debug(cust.name)

post_save.connect(send_admin_email, sender=Information)

Edit: apollo13 in #django alerted me to this: "Related items (the things being saved into the many-to-many relation) are not saved as part of a model's save method, as you have discovered." - http://groups.google.com/group/django-users/msg/2b734c153537f970

But since its from Jul 9 2006 I really really hope there is a solution for this.

4

3 に答える 3

5

ここに直面している問題の未解決のチケットがあります。いつリリースされるかを監視するか、提供されているパッチを適用してみて、それが役立つかどうかを確認できます。

于 2009-08-03T13:12:06.500 に答える
2

モデルに M2M フィールドがあるため、同じ問題に遭遇しました。データのような pre_save も取得しました。

この状況での問題は、自動生成された ID を取得するために、M2M フィールドで関連する両方のモデルを保存する必要があることです。

私のソリューションでは、post_save シグナルも m2m_changed シグナルも使用しませんでした。シグナルの代わりに、ModelAdmin クラス定義で log_addition および log_change メソッドを使用しました。

カスタム ModelAdmin クラスで:

    class CustomModelAdmin(admin.ModelAdmin):
         def log_addition(self, request, object):
         """
         Log that an object has been successfully added.
         """
             super(CustomModelAdmin, self).log_addition(request, object)
             #call post_save callback here object created

         def log_change(self, request, object):
         """
         Log that an object has been successfully changed.
         """
             super(CustomModelAdmin, self).log_change(request, object)
             #call post_save callback here object changed

必要に応じて、log_deletion() メソッドをオーバーライドすることもできます。

ハッピーオーバーライド...

于 2012-02-07T08:01:11.160 に答える
2

上記の code.djangoproject.com からパッチを適用した後、これが私の解決策です。

これを models.py に追加しました:

from django.db.models.signals import m2m_changed
m2m_changed.connect(send_admin_email, sender=Information)

そして send_admin_email 関数:

def send_customer_email(sender, instance, action, model, field_name, reverse, objects, **kwargs):
    if ("add" == action):
        # do stuff
于 2009-08-09T15:43:04.270 に答える