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")
这个代码在运行时很好用。我可以使用管理员创建一个新用户并且其他三个表也会得到合理的条目。(除了员工,因为当保存表单时用户的名字和姓氏没有被填写)我仍然不明白为什么会这样。
问题出现在我运行测试套件时。在此之前,我创建了一堆fixture来在表格中创建这些条目。现在我得到了一个错误,提示:
IntegrityError: duplicate key value violates unique constraint "core_userprofile_user_id_key"
我认为这是因为我已经在ID为"1"的fixture中创建了一个公司(company)、员工(employee)和档案(profile)记录,现在post_save信号(signal)正在尝试重新创建它。
我的问题是:在运行fixtures时可以禁用此post_save signal吗? 我可以检测到自己正在作为测试套件的一部分运行并且不创建这些记录吗?我现在应该从fixtures中删除这些记录吗(虽然该信号只设置默认值而不是我想要进行测试的值)?为什么fixture加载代码不能覆盖已经创建的记录?
人们是如何做到这一点的?
created
并删除多余的括号:if created and not kwargs.get('raw', False):
- Joe Tricarico