以下代码作为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
语句没有返回任何内容,因为它们添加了相同的用户(移动),最后创建了一个重复的用户进入系统。
...即
如何阻止这种情况发生?
我唯一的想法是可能在save()的DB级别?检查用户是否存在,但是,我总是需要从此函数返回用户新用户或现有用户,因此我遇到了另一组问题。
答案 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
。