10

@receiverデコレータを使用してコールバックにシグナルを登録しました

@receiver(post_save, sender=User, dispatch_uid='ARandomUniqueString') 
def do_callback(sender, **kwargs):

from app.signals import *コードを挿入しましたが__init__.py、2 回インポートされていることがわかります。これを修正する良い方法はないと思います。おそらくinstalled appsin が原因で発生していsettings.pyます。dispatch_uid使用してmodelInstance.save1回だけ呼び出されたにもかかわらず、2回実行される理由がわかりませんdo_callback。助言がありますか?

4

4 に答える 4

13

さて、インポートをに移動しましたviews.py(または、インポートmodels.pyが1回だけ行われている間に、2回呼び出されていました。

問題はpost_save、オブジェクトが作成されたときと保存されたときに信号が呼び出されることでした。理由がわからないので、回避策を追加しました。

created = False

    #Workaround to signal being emitted twice on create and save
    if 'created' in kwargs:
        if kwargs['created']:
            created=True

    #If signal is from object creation, return
    if created:
        return

編集:

post_save.create(...)に相当するものを使用したため、2回呼び出されていました。__init__(...).save()

結論

dispatch_uid動作し、単一のインポートを実行することは依然として良い習慣です。

于 2012-08-17T21:12:45.500 に答える
1

from app.signals import *コードを入れました__init__.py

__init__.pyファイルには何も入れないでください。

これを から削除__init__.pyして の一番下に追加するとmodels.py、問題が解決するはずです。

また、「ブラインド」インポートを避ける必要がありますfrom foo import *

于 2012-08-17T20:57:58.913 に答える