2009-08-03 13 views
9

多くの「得意先」に「情報」オブジェクトを接続しようとしています(下のコードを参照)Djangoのpost_saveシグナルが私にpre_saveデータを与えるのはなぜですか?

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

、私は常にデータを保存する前に、どのようなものであるかを取得信号recievesこと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) 

編集:(物事が多対多の関係に保存されている) は、あなたのように、のは、メソッドを保存するモデルの一部として保存されていない 「関連項目:#djangoでapollo13はこれに私を警告発見した。 - http://groups.google.com/group/django-users/msg/2b734c153537f970

しかし、その7月9日から2006年以来、私は本当にこのためのソリューションがあります願っています。

答えて

5

あなたがhereに直面している問題のためのオープンチケットがあります。あなたはそれをリリースにするときの目に留めておくか、それが提供するパッチを適用してそれが役立つかどうかを調べることができます。

+0

お返事ありがとうございます。私はパッチを試して、少しハッキングした後、私はそれを動作させた。下に解決策を掲載します。 – schmilblick

1

これは上記の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 
1

私は私も同じようpre_saveを得た私のモデルにM2M分野を持っているので、私は同じ問題全体を実行データ。状況で

、問題は、M2M分野に関連するモデルの両方が自動生成されたIDを取得するために保存されるべきであるということです。私の解決策では

、どちらも私はModelAdminのクラス定義でlog_additionとlog_changeメソッドを使用し、代わりにその信号を、post_save信号もm2m_changed信号を使用していました。カスタム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()メソッドをオーバーライドすることができます。

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

関連する問題