Как установить связь между пользовательским объектом (custom user) и токеном в Django?

Здравствуйте! Я новичок в Django, и, возможно, мой вопрос не совсем корректный. У меня есть код, который позволяет регистрировать пользователя, входить в систему с получением токена, а также просматривать информацию по токену и выходить из аккаунта. Как я могу создать кастомную модель пользователя с дополнительными полями, такими как имя, фамилия и возраст? 

Вот ссылка на инструкцию и код: <a href="https://github.com/FlDanyT/my_Django_documentation/tree/main" rel="nofollow">https://github.com/FlDanyT/my_Django_documentation...</a>

Код моделей выглядит следующим образом: 
<br/> models.py <br/> 
<pre><code class="python">import secrets
from django.db import models
from django.contrib.auth.models import User # Встроенная модель пользователя Django

class UserToken(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='token')
    token = models.CharField(max_length=64, unique=True, blank=True)

    def generate_token(self):
        self.token = secrets.token_hex(32)  # Генерируем безопасный токен
        self.save()
        return self.token

    def __str__(self):
        return f'Token for {self.user.username}' # Ответ серверу</code></pre> 
<br/> Код сериализаторов: <br/>
<pre><code class="python">from django.contrib.auth.models import User
from rest_framework import serializers
from .models import UserToken

class UserRegisterSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True, min_length=8)

    class Meta:
        model = User
        fields = ['username', 'email', 'password']

    def create(self, validated_data):
        user = User.objects.create_user(**validated_data)
        UserToken.objects.create(user=user)  # Создаем токен для пользователя
        return user

class UserLoginSerializer(...</code></pre>
  • 2 февраля 2025 г. 11:44
Ответы на вопрос 2
Для создания кастомной модели пользователя с дополнительными полями в Django, следует использовать `AbstractUser` или `AbstractBaseUser` в качестве базового класса. В вашем случае, с учетом того, что вы хотите добавить только несколько полей к существующей модели пользователя, проще всего использовать `AbstractUser`.

### Шаги для создания кастомной модели пользователя:

1. **Создайте кастомную модель пользователя**:
   В вашем файле `models.py` создайте модель, которая будет наследовать от `AbstractUser`. Добавьте необходимые поля, такие как имя, фамилия и возраст.

```python
from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    first_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=30, blank=True)
    age = models.PositiveIntegerField(null=True, blank=True)

    def __str__(self):
        return self.username
```

2. **Обновите настройки Django**:
   Укажите вашу кастомную модель пользователя в настройках Django. В файле `settings.py` добавьте:

```python
AUTH_USER_MODEL = 'your_app_name.CustomUser'
```

Не забудьте заменить `your_app_name` на имя вашего приложения.

3. **Миграции**:
   После создания новой модели выполните миграции для обновления базы данных:

```bash
python manage.py makemigrations
python manage.py migrate
```

4. **Обновите сериализаторы**:
   Теперь необходимо обновить сериалиаторы, чтобы они работали с вашей кастомной моделью пользователя:

```python
from .models import CustomUser, UserToken
from rest_framework import serializers

class UserRegisterSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True, min_length=8)

    class Meta:
        model = CustomUser  # Используем кастомную модель пользователя
        fields = ['username', 'email', 'password', 'first_name', 'last_name', 'age']

    def create(self, validated_data):
        user = CustomUser.objects.create_user(**validated_data)
        UserToken.objects.create(user=user)  # Создаем токен для пользователя
        return user
```

5. **Создание токена**:
   Модель `UserToken` уже правильно настроена для связи с пользователем через `OneToOneField`, так что изменений здесь вносить не нужно. 

6. **Адаптация логики входа и выхода**:
   Также убедитесь, что ваш код для логики входа и выхода из системы использует кастомную модель пользователя.

### Пример кода для регистрации пользователя:
Теперь, когда вы уже настроили кастомную модель пользователя и сериализаторы, ваш код для регистрации пользователей, входа и управления токенами может выглядеть следующим образом:

```python
# views.py
from rest_framework import generics
from .serializers import UserRegisterSerializer, UserLoginSerializer

class UserRegisterView(generics.CreateAPIView):
    serializer_class = UserRegisterSerializer
```

Таким образом, вы создали кастомную модель пользователя с дополнительными полями и установили связь с токеном. Не забудьте протестировать функциональность приложения, чтобы убедиться, что все работает корректно.
Перво-наперво вам всё-таки нужно создать желаемую модель юзера, унаследовав её от django.contrib.auth.models.AbstractUser. 
Эту модель (традиционно назовём её CustomUser) нужно зарегистрировать в settings.py:
AUTH_USER_MODEL = 'your_app.CustomUser'
И это, собственно, и всё.

Однако, по всей вероятности, вам также понадобятся формы для админки

# your_app/forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser

class CustomUserCreationForm(UserCreationForm):

    class Meta:
        model = CustomUser
        fields = ...

class CustomUserChangeForm(UserChangeForm):

    class Meta:
        model = CustomUser
        fields = ...


Потом это всё регистрируется в админке и готово, можно делать миграции и пользоваться. Главное, чтобы в остальном ваш проект был готов к замене модели юзера. Для этого документация рекомендует не хардкодить модель User, а получать её при помощи get_user_model (полезно читать всё-таки документацию).
Похожие вопросы