Django - 在运动员创建时自动创建用户(与 OneToOneField 绑定在一起)

Django - automatically create User on Athlete create (tied together with a OneToOneField)

我有一个名为 Athlete 的模型,它与作为 AbstractUser 的 User 模型具有 OneToOne 关系,每当我创建 Athlete 并自动将它们绑定在一起时,我都会尝试创建一个用户,但出现错误:

Manager isn't available; 'auth.User' has been swapped for 'users.User'

这是我的用户模型:

class User(AbstractUser):
    is_athlete = models.BooleanField(default=False)
    is_coach = models.BooleanField(default=False)
    is_owner = models.BooleanField(default=False)

    def save(self, *args, **kwargs):
        self.is_athlete = Athlete.objects.filter(user=self).exists()
        self.is_coach = Coach.objects.filter(user=self).exists()
        self.is_owner = Organization.objects.filter(owner=self).exists()
        super().save(*args, **kwargs)

和运动员模型(到目前为止):

class Athlete(models.Model):
    user = models.OneToOneField(User, blank=True, null=True, on_delete=models.SET_NULL)
    coach = models.ForeignKey(Coach, blank=True, null=True, on_delete=models.SET_NULL, related_name='coach')

    def save(self, *args, **kwargs):
        try:
            User.objects.get(email=kwargs.get('email'))
            print('User with this mail already exists')
        except User.DoesNotExist:
            print('User with this mail does not exist')
            new_user = AuthUser.objects.create_user(email=email)
            self.user = new_user
            new_user.save()
        super().save(*args, **kwargs)

我打电话给AuthUser.objects.create_user因为User已经是User的名字class,所以我导入django auth用户用:

from django.contrib.auth.models import User as AuthUser

您现在使用另一个模型作为用户模型,这意味着您也使用它来注册用户,所以:

from users.models import <strong>User</strong>

class Athlete(models.Model):
    user = models.OneToOneField(User, blank=True, null=True, on_delete=models.SET_NULL)
    coach = models.ForeignKey(Coach, blank=True, null=True, on_delete=models.SET_NULL, related_name='coach')

    def save(self, *args, **kwargs, email=None):
        try:
            self.user = User.objects.get(email=email)
        except User.DoesNotExist:
            self.user = new_user = <strong>User</strong>.objects.create_user(email=email)
        super().save(*args, **kwargs)