AbstractBaseUser - создание модели приводит к тому, что в поле 'id' ожидается число, а получается строка?

Я пытаюсь создать пользовательскую User модель:

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

Отслеживание (последний последний вызов): File "/Users/xxx/eb-virt/lib/python3.8/site-packages/django/db/models/fields/init.py", line 1988, in get_prep_value return int(value)

ValueError: invalid literal for int() with base 10: 'hashtag'

>

Вышеуказанное исключение было непосредственной причиной следующего исключения:

models.py

from django.db import models
# from django.contrib.auth.models import User
from django.contrib.auth.models import (
    AbstractBaseUser, BaseUserManager, PermissionsMixin
)


class UserManager(BaseUserManager):

    def create_user(self, username, email, password=None):
        if username is None:
            raise TypeError('Please fill a username')
        if email is None:
            raise TypeError('Please fill in an Email')
        print("We passed UserManager checks")
        user = self.model(username, email=self.normalize_email(email))
        user.set_password(password)
        user.save()
        print("we are just before user save in create_user, DONE")

    def create_superuser(self, username, email, password=None):
        if password is None:
            raise TypeError('Password is needed')
        if username is None:
            raise TypeError('Please fill a username')
        if email is None:
            raise TypeError('Please fill in an Email')

        user = self.create_user(username, email, password)
        user = self.model(username, email=self.normalize_email(email))
        user.is_superuser = True
        user.is_staff = True
        user.save()
        return user


class User(AbstractBaseUser, PermissionsMixin):
    # id = models.ForeignKey(on_delete=models.CASCADE, primary_key=True, unique=True)
    username = models.CharField(max_length=255, unique=True, db_index=True)
    email = models.EmailField(max_length=255, unique=True, db_index=True)
    is_verified = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    created_at = models.DateField(auto_now_add=True)
    updated_at = models.DateField(auto_now=True)

    # Change the username default field to email
    USERNAME_FIELD = 'email'  # username
    # Fields that are required
    REQUIRED_FIELDS = ['username']

    objects = UserManager()

    def __str__(self):
        return self.email

    def tokens(self):
        return ''

api.py

class RegisterAPI(generics.GenericAPIView):
    serializer_class = RegisterSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        print(serializer.validated_data)
        serializer.save()
        print('validated_data')
        user_data = serializer.validated_data
        # print('validated_data')
        print(user_data)
        return Response(user_data)

serializers.py

from rest_framework import serializers
from .models import User
from django.contrib.auth import authenticate

class RegisterSerializer(serializers.ModelSerializer):
    password = serializers.CharField(max_length=68, min_length=6,
                                     write_only=True)

    class Meta:
        model = User
        fields = ['username', 'email', 'password']
        # extra_kwargs = {'password': {'write_only': True}}

    def validate(self, attrs):
        email = attrs.get('email', '')
        username = attrs.get('username', '')
        if not username.isalnum():
            raise serializers.ValidationError("Username can only contain alpha-numeric characters")
        return attrs

    def create(self, validated_data):
        print('Increate')
        # validated_data['password'] = make_password(validated_data['password'])
        user = User.objects.create_user(username=validated_data['username'],
                                        email=validated_data['email'],
                                        password=validated_data['password'])
        print("Passed user create")
        return user

0001_initial.py

# Generated by Django 4.0.6 on 2022-09-30 12:35

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('auth', '0012_alter_user_first_name_max_length'),
    ]

    operations = [
        migrations.CreateModel(
            name='User',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('password', models.CharField(max_length=128, verbose_name='password')),
                ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
                ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
                ('username', models.CharField(db_index=True, max_length=255, unique=True)),
                ('email', models.EmailField(db_index=True, max_length=255, unique=True)),
                ('is_verified', models.BooleanField(default=False)),
                ('is_active', models.BooleanField(default=True)),
                ('is_staff', models.BooleanField(default=False)),
                ('created_at', models.DateField(auto_now_add=True)),
                ('updated_at', models.DateField(auto_now=True)),
                ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')),
                ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')),
            ],
            options={
                'abstract': False,
            },
        ),
    ]

В миграциях id является auto_created, я каким-то образом отменяю auto_created и даю поле username для id?

Я не могу заметить ошибку.

Сначала я попробовал заменить этот код в приложении accounts существующего проекта. Подумал, что проблема может быть в этом, поэтому начал новый проект и получил ту же ошибку. Пробовал несколько вариантов ответа на этот вопрос, например, запустить python manage.py makemigrations, python manage.py migrate, удалить файлы миграции и снова выполнить migrate. Удалял базу данных. Ничего не помогает.

Использование почтальона:

Post request to: http://127.0.0.1:8000/api/auth/register/
Body:
{
    "email": "test@test.com",
    "username": "test123",
    "password": "123456"
}
Вернуться на верх