Createsuperuser дает KeyError после внедрения пользовательского пользователя
Здравствуйте, я довольно новичок в Django и пытаюсь настроить довольно простой rest API. Я использую djoser для обработки аутентификации. Однако я хочу использовать пользовательскую модель пользователя. Где 1. уникальным полем является email (вместо имени пользователя) и 2. у него есть одно дополнительное поле.
Я пытался следовать этим двум руководствам,
https://testdriven.io/blog/django-custom-user-model/. (Для использования электронной почты вместо имени пользователя)
https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html#abstractuser (Для расширения модели пользователя)
Я создаю модель следующим образом,
class MyUser(AbstractUser):
username = None
email = models.EmailField(_('email address'), unique=True)
DIET_CHOICES = (
('vegan', 'Vegan'),
('vegetarian', 'Vegetarian'),
('meat', 'Meat')
)
diet = models.CharField(max_length=10, choices=DIET_CHOICES)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = [diet]
objects = CustomUserManager()
def __str__(self):
return self.email
Использование CustomUserManager(), как показано в https://testdriven.io/blog/django-custom-user-model/.
Я также зарегистрировал пользователя в AUTH_USER_MODEL. Посмотрев на файл миграции, я получил то, что ожидал. Но после миграции, когда я затем пытаюсь запустить createsuperuser, это мгновенно приводит к следующей ошибке
Traceback (most recent call last):
File "/home/frederik/Documents/andet/madklubTests/2madklubDjango/venv/lib/python3.9/site-packages/django/db/models/options.py", line 672, in get_field
return self.fields_map[field_name]
KeyError: <django.db.models.fields.CharField: diet>
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/frederik/Documents/andet/madklubTests/2madklubDjango/manage.py", line 22, in <module>
main()
File "/home/frederik/Documents/andet/madklubTests/2madklubDjango/manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/home/frederik/Documents/andet/madklubTests/2madklubDjango/venv/lib/python3.9/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line
utility.execute()
File "/home/frederik/Documents/andet/madklubTests/2madklubDjango/venv/lib/python3.9/site-packages/django/core/management/__init__.py", line 440, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/frederik/Documents/andet/madklubTests/2madklubDjango/venv/lib/python3.9/site-packages/django/core/management/base.py", line 406, in run_from_argv
parser = self.create_parser(argv[0], argv[1])
File "/home/frederik/Documents/andet/madklubTests/2madklubDjango/venv/lib/python3.9/site-packages/django/core/management/base.py", line 369, in create_parser
self.add_arguments(parser)
File "/home/frederik/Documents/andet/madklubTests/2madklubDjango/venv/lib/python3.9/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 60, in add_arguments
field = self.UserModel._meta.get_field(field_name)
File "/home/frederik/Documents/andet/madklubTests/2madklubDjango/venv/lib/python3.9/site-packages/django/db/models/options.py", line 674, in get_field
raise FieldDoesNotExist(
django.core.exceptions.FieldDoesNotExist: MyUser has no field named 'MyUser.MyUser.diet'
Кажется, что это может быть не специфическая проблема с createsuperuser, а скорее проблема в целом с регистрацией пользователей. Однако я не уверен, почему это происходит.
Заменить
REQUIRED_FIELDS = [diet]
с
REQUIRED_FIELDS = ['diet']
Вы должны поставить имя поля вместо самого поля.
Вы указываете необходимые поля как names, то есть строки, содержащие названия полей.
Да, я подумал, что это может быть проблемой, но не уверен, почему? Как мне тогда создать обязательное поле в моей модели? Скажем, я хочу, чтобы
diet
,first_name
,last_name
были обязательными?
Затем вы создаете список строк с этими именами, так:
class MyUser(AbstractUser):
username = None
email = models.EmailField(_('email address'), unique=True)
DIET_CHOICES = (
('vegan', 'Vegan'),
('vegetarian', 'Vegetarian'),
('meat', 'Meat')
)
diet = models.CharField(max_length=10, choices=DIET_CHOICES)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'last_name', 'diet']
objects = CustomUserManager()
def __str__(self):
return self.email