首页 > 解决方案 > 在 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)

标签: django

解决方案


您在这里没有显示足够的代码,但您的代码可能正在事务中运行。就像是:

with transaction.atomic():
    profile.save()

当事务失败时IntegrityError,您无法在此事务中执行任何其他操作,它已经终止。


推荐阅读