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
Вернуться на верх