0

2 回呼び出されるという問題があり、post_save前述のようにインポートを理解するのに多くの時間を費やしました。インポートは 1 回のみで、複数登録の問題がないことを確認しました。dispatch_uidまた、ドキュメントに従って問題を解決する必要があるシグナル登録で一意のものを使用しています。それはしませんでした。さらに注意深く調べたところ、シグナル ハンドラが .create() と .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

これは、 uid にもかかわらず、Django ポストセーブシグナルが 2 回呼び出されるという質問へのフォローアップです。

4

1 に答える 1

1

「作成」はインスタンス化と保存であるためです。

create(**kwargs)

オブジェクトを作成し、すべてを 1 つのステップで保存するための便利な方法。したがって:

p = Person.objects.create(first_name="Bruce", last_name="Springsteen")

と:

p = Person(first_name="Bruce", last_name="Springsteen")
p.save(force_insert=True)

同等です。

于 2012-08-19T19:28:51.310 に答える