gpt4 book ai didi

python - Django get_or_create 创建相关对象时的竞争条件

转载 作者:行者123 更新时间:2023-11-29 07:36:20 28 4
gpt4 key购买 nike

我有一个像这样的 ExtendedUser 模型,它只指向 Django 的 User 模型:

class ExtendedUser(models.Model):
user = models.OneToOneField(User)

当收到请求时,如果我要查找的用户不存在,我想获取或创建一个 User 及其相关的 ExtendedUser。我有这段代码:

def get_or_create_user(username):
with transaction.atomic():
user, created = User.objects.get_or_create(
username=username,
defaults={
'first_name': "BLABLA",
},
)

if created:
extended_user = ExtendedUser()
extended_user.user = user
extended_user.save()

return user

我将其包装在事务中,以确保我不会创建 User 但不会创建其关联的 ExtendedUser

但是,当两个请求同时进入将创建相同的用户时,对于这两个请求,这有时会失败并出现 IntegrityError。所以我最终没有创建用户..

IntegrityError: (1062, "Duplicate entry 'BLABLABLA' for key 'username'")

请注意,我使用 MySQL,但我强制使用 READ COMMITTED 隔离级别。

我做错了什么?我该如何处理?模型需要保持原样。

最佳答案

也许您应该使用 signals 来解决这个问题.

保存用户后,将触发一个信号。它位于您应该创建 ExtendedUser 的信号处理程序中。

from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
ExtendedUser.objects.create(user=instance)

关于python - Django get_or_create 创建相关对象时的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48584254/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com