仅当其他对象成功创建时才创建对象

2024-04-29

我对 Django 相当陌生,并且不熟悉这种情况的最佳实践(在任何框架/语言中,而不仅仅是 python/django)。

情况是,当用户第一次在我的网站上注册时,我想为他们创建一个“组织”(如果它不存在),然后随后为他们创建一个引用该组织的用户。我从来不想只插入一个而没有另一个,但我需要先创建组织,以便可以为每个用户保存组织 UUID。目前,即使创建用户出现问题,仍然会创建组织。这显然是一个问题,因为我的组织没有附加任何用户。

我不完全知道如何在创建组织之前检查用户是否已正确创建,但沿着这些思路似乎是我需要做的事情。在组织对象创建上使用 commit=false 似乎不起作用,因为我需要获取 UUID。所以我不确定继续的最佳方法。

我正在覆盖流行的身份验证包 django-allauth 的序列化器中的 save 方法

模型.py

class Organization(models.Model):
  alphanumeric_plus_underscore = RegexValidator(r'^[\w]+$', 'Only alphanumeric characters are allowed.')
  id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)  # pylint: disable=invalid-name
  name = models.CharField(max_length=20, unique=True, validators=[alphanumeric_plus_underscore, MinLengthValidator(4)])
  logo = models.FileField(upload_to='files/organization_logos/', null=True, blank=True)

class User(AbstractBaseUser):
  id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)  # pylint: disable=invalid-name
  first_name = models.CharField(_('First Name'), max_length=50)
  last_name = models.CharField(_('Last Name'), max_length=50)
  email = models.EmailField(_('Email address'), unique=True)
  organization = models.ForeignKey(Organization, blank=False, null=False, on_delete=models.DO_NOTHING)

序列化器.py

def save(self, request):
    # generate organization object
    organization_data = self.validated_data.pop('organization')
    organization = Organization.objects.create(**organization_data)
    self.validated_data['organization'] = organization

    adapter = get_adapter()
    user = adapter.new_user(request)
    self.cleaned_data = self.get_cleaned_data()
    user.organization = organization #self.cleaned_data.get('organization')
    adapter.save_user(request, user, self)
    self.custom_signup(request, user)
    setup_user_email(request, user, [])

    return user

非常感谢任何指导。


原子性是数据库事务的定义属性。原子允许我们创建一个代码块,在其中保证数据库的原子性。如果代码块成功完成,则更改将提交到数据库。如果出现异常,则回滚更改。

from django.db import transaction

def viewfunc(request):
    # This code executes in autocommit mode (Django's default).
    do_stuff()

    with transaction.atomic():
        # This code executes inside a transaction.
        do_more_stuff()

了解更多详情refer https://docs.djangoproject.com/en/2.2/topics/db/transactions/#controlling-transactions-explicitly到给定的链接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅当其他对象成功创建时才创建对象 的相关文章

随机推荐