django - 在 Django 中保存具有 OneToOne 关系的模型时出现 TransactionManagementError
问题描述
我正在尝试这样做,以便在创建 User 模型时,它还会创建相应的 MyAppProfile 类以与之配套。但是当我这样做时,正如我在网上看到的那样,我得到了一个错误。
当前事务发生错误。在“原子”块结束之前,您无法执行查询。
我尝试了各种方法来做到这一点,当我尝试时它们会给出错误。我不知道为什么我会收到这个错误,或者它到底来自哪里。
我的个人资料类:
class MyAppProfile(models.Model):
user = models.OneToOneField(AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="myapp_profile")
# Other fields for this app's profile go here
def __str__(self):
return f'{self.id}: MyApp Profile for {self.user.username}'
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
@receiver(post_save, sender=AUTH_USER_MODEL)
def update_profile_signal(sender, instance, created, **kwargs):
if created:
MyAppProfile.objects.create(user=instance)
instance.myapp_profile.save()
编辑:
我的用户模型:
class User(AbstractUser):
id = UUIDField()
def save(self, *args, **kwargs):
if not self.pk:
saved = False
attempts = 0
while not saved:
try:
if attempts > 5:
raise RuntimeError('Max attempts reached trying to save to database.')
super().save(*args, **kwargs)
except IntegrityError:
attempts += 1
self.id = gen_uuid(length=8)
解决方案
您在这里没有显示足够的代码,但您的代码可能正在事务中运行。就像是:
with transaction.atomic():
profile.save()
当事务失败时IntegrityError
,您无法在此事务中执行任何其他操作,它已经终止。
推荐阅读
- javascript - 使链接完全显示时可点击
- redis - jedis 版本兼容 redis 5.0.2
- c# - C#如何从网站只获取一个字符串
- jenkins - 从管道脚本将环境变量设置为 Allure 报告
- python - 如何使用 gensim 在 Windows 上运行 word2vec
- python - 在现场运行 Python 程序
- sass - Sass根据body类改变变量的值?
- logging - 如何在 elixir 中为除控制台以外的后端记录器启用记录器白名单?
- java - Jdbc:在应用程序退出时运行语句会发生什么?
- angular - 更新角度共享组件中的视图(html)