如何阻止Celery在此任务中创建重复的用户?

时间:2014-12-08 21:11:59

标签: python django celery

以下代码作为Celery Task的一部分运行,以添加新用户。它首先检查我们是否有现有用户。在正常情况下,这非常有用:

  def create_user(self, mobile, email=None, password=None):
        try:
            app_user = get_user_model()
            user = app_user.objects.get(mobile=mobile)
        except app_user.DoesNotExist:
            user = self.model()
            user.mobile = mobile
            user.set_password(password)
            user.save(using=self._db)

        return user

我的问题:假设我上传的文件包含重复的用户(手机号码)。代码应该停止。然而,由于芹菜非常好,我发现实际上发生的是两个工人有时可以同时运行。第一个Try语句没有返回任何内容,因为它们添加了相同的用户(移动),最后创建了一个重复的用户进入系统。

...即

enter image description here

如何阻止这种情况发生?

我唯一的想法是可能在save()的DB级别?检查用户是否存在,但是,我总是需要从此函数返回用户新用户或现有用户,因此我遇到了另一组问题。

1 个答案:

答案 0 :(得分:1)

由于数据库操作是原子的,您可以使用EAFP(我假设移动字段被用作用户名,因此是唯一的):

try:
    return self.model.objects.create_user(
        mobile=mobile,
        password=password,
    )
except IntegrityError:
    return self.model.objects.get(mobile=mobile)

您可能必须覆盖自定义用户模型的管理员方法create_user