python - 如何防止灯具与 django post_save 信号代码冲突?

标签 python django signals fixtures django-signals

在我的应用程序中,我想在新用户注册时在某些表中创建条目。例如,我想创建一个用户资料,然后为他们引用他们的公司和其他一些记录。我用 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")

这在运行时效果很好。我可以使用管理员创建一个新用户,而其他三个表也可以使用 sensible 获取条目。 (除了保存时没有在admin的表单中填写user.first_name和user.last_name之后的员工。我还是不明白为什么会这样)

问题是在我运行我的测试套件时出现的。在此之前,我已经创建了一堆固定装置来在表格中创建这些条目。现在我收到一条错误消息:

IntegrityError: duplicate key value violates unique constraint "core_userprofile_user_id_key"

我认为这是因为我已经在 id 为“1”的 fixture 中创建了公司、员工和个人资料记录,现在 post_save 信号正在尝试重新创建它。

我的问题是:我可以在运行灯具时禁用这个 post_save 信号吗?我可以检测到我作为测试套件的一部分运行而不创建这些记录吗?我现在应该从 fixture 中删除这些记录吗(尽管信号只设置默认值而不是我想要测试的值)?为什么 fixture 加载代码不直接覆盖创建的记录?

人们如何做到这一点?

最佳答案

我想我找到了一种方法来做到这一点。与信号一起传入的 kwargs 中有一个“原始”参数,所以我可以用这个替换上面的测试:

if (kwargs.get('created', True) and not kwargs.get('raw', False)):

在 loaddata 运行时使用 Raw。这似乎可以解决问题。

这里提到:http://code.djangoproject.com/ticket/13299

如果记录在案就好了:http://docs.djangoproject.com/en/1.2/ref/signals/#django.db.models.signals.post_save

关于python - 如何防止灯具与 django post_save 信号代码冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3499791/

相关文章:

Python在子类中使用父类的变量

python - 用第二个 DF 填充 DF

python - 使用 numpy einsum 将向量列表乘以一个矩阵

django - 字段选择()作为查询集?

c++ - Qt 插槽未被调用

python - 使用 SFTP 缓慢上传许多小文件

python - Django 中的分组表单字段?

python - django-tables 2 M2M 字段未显示

从 SIMD 指令捕获 SIGFPE

c++ - SIGALRM 超时——它如何影响现有操作?