私のアプリケーションでは、新しいユーザーがサインアップしたときに特定のテーブルにエントリを作成したいと思います。たとえば、会社やその他のレコードを参照するユーザープロファイルを作成したいと思います。post_saveシグナルでこれを実装しました:
def callback_create_profile(sender, **kwargs):
# check if we are creating a new User
if kwargs.get('created', True):
user = kwargs.get('instance')
company = Company.objects.create(name="My Company")
employee = Employee.objects.create(company=company, name_first=user.first_name, name_last=user.last_name)
profile = UserProfile.objects.create(user=user, employee=employee, partner=partner)
# Register the callback
post_save.connect(callback_create_profile, sender=User, dispatch_uid="core.models")
これは実行時にうまく機能します。adminを使用して新しいユーザーを作成でき、他の3つのテーブルも適切なエントリを取得します。(つまり、user.first_nameとuser.last_name以降の従業員は、保存時に管理者のフォームに入力されません。なぜそのように行われるのかはまだわかりません)
テストスイートを実行したときに問題が発生しました。この前に、テーブルにこれらのエントリを作成するための一連のフィクスチャを作成していました。ここで、次のようなエラーが発生します。
IntegrityError: duplicate key value violates unique constraint "core_userprofile_user_id_key"
これは、IDが「1」のフィクスチャに会社、従業員、およびプロファイルレコードをすでに作成していて、post_saveシグナルがそれを再作成しようとしているためだと思います。
私の質問は次のとおりです。フィクスチャを実行しているときにこのpost_saveシグナルを無効にできますか?テストスイートの一部として実行していて、これらのレコードを作成していないことを検出できますか?これらのレコードをフィクスチャから今すぐ削除する必要がありますか(信号はデフォルトを設定するだけで、テストしたい値は設定しません)?フィクスチャのロードコードが作成されたレコードを上書きしないのはなぜですか?
人々はこれをどのように行うのですか?