Search code examples
django-rest-frameworkdjango-users

How to create user profile object in Django REST API?


I have two user profile models, each refers to custom user

user/models.py

class Role(models.TextChoices):
    ONE = 'ON', 'One'
    TWO = 'TW', 'Two'


class ProfileOne(models.Model):
    user = models.OneToOneField('CustomUser', on_delete=models.CASCADE)


class ProfileTwo(models.Model):
    user = models.OneToOneField('CustomUser', on_delete=models.CASCADE)


PROFILE_MAP = {
    Role.ONE: ProfileOne,
    Role.TWO: ProfileTwo
}


class CustomUser(AbstractUser):
   # fields definition
   role = models.CharField(max_length=2, choices=Role.choices, null=True)

   objects = CustomUserManager()

   def create_profile(self, role):
        profile = PROFILE_MAP[role](user=self)
        profile.save()

        return profile

I need to create profile for user after registration. I've tried to do this in custom user manager's create_user() method but it takes no effect.

user/managers.py

class CustomUserManager(BaseUserManager):
    def create_user(self, first_name, last_name, email, role, password, **extra_fields):
        # user initialization
        user.save()
        user.create_profile(role)

        return user

What the problem? And is managers suitable for this?


Solution

  • I figured out this action should be performed in adapters.

    users/adapters.py

    class CustomUserAccountAdapter(DefaultAccountAdapter):
        def save_user(self, request, user, form, commit=False):
            user = super().save_user(request, user, form, commit)
            data = form.cleaned_data
            user.role = data.get('role')
            user.save()
            user.create_profile(user.role)
    
            return user
    

    project/settings.py

    ACCOUNT_ADAPTER = 'users.adapters.CustomUserAccountAdapter'