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"
}