在我的应用程序中,我想在新用户注册时在某些表中创建条目。例如,我想创建一个用户配置文件,然后该配置文件将引用他们的公司和他们的一些其他记录。我用 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")
这在运行时效果很好。我可以使用管理员创建一个新用户,其他三个表也可以获取合理的条目。 (除此之外,由于 user.first_name 和 user.last_name 在保存时没有在管理员表单中填写,因此我仍然不明白为什么要这样做)
当我运行测试套件时,问题出现了。在此之前,我创建了一堆固定装置来在表中创建这些条目。现在我收到一条错误消息:
IntegrityError: duplicate key value violates unique constraint "core_userprofile_user_id_key"
我认为这是因为我已经在 ID 为“1”的装置中创建了一家公司、员工和个人资料记录,现在 post_save 信号正在尝试重新创建它。
我的问题是:运行灯具时可以禁用此 post_save 信号吗?我可以检测到我正在作为测试套件的一部分运行而不创建这些记录吗?我现在应该从灯具中删除这些记录吗(尽管信号仅设置默认值而不是我想要测试的值)?为什么夹具加载代码不覆盖创建的记录?
人们如何做到这一点?