Почему получение (пользователь.модели.Не существует: запрос на соответствие пользовательскому пользователю не существует.)?

#python #django

Вопрос:

Я создал две модели CustomUser, наследующие AbstractUser и UserProfile, и между ними существует одна связь.

затем я выполняю следующую команду:-

 python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
 

Когда я запускаю команду для createsuperuser, я получил следующую ошибку:-(модель опубликована в конце..)

 PS C:UsersakcaiOneDriveDesktopdeep_Stuffsgit_clonedPollingApplication> python manage.py createsuperuser
Email: admin@gmail.com
Name: admin
Username: admin
Password:
Password (again):
The password is too similar to the username.
This password is too short. It must contain at least 8 characters.
This password is too common.
Bypass password validation and create user anyway? [y/N]: y
profile create too..
Traceback (most recent call last):
  File "C:UsersakcaiOneDriveDesktopdeep_Stuffsgit_clonedPollingApplicationmanage.py", line 22, in <module>
    main()
  File "C:UsersakcaiOneDriveDesktopdeep_Stuffsgit_clonedPollingApplicationmanage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "C:UsersakcaiAppDataLocalProgramsPythonPython39libsite-packagesdjangocoremanagement__init__.py", line 419, in execute_from_command_line
    utility.execute()
  File "C:UsersakcaiAppDataLocalProgramsPythonPython39libsite-packagesdjangocoremanagement__init__.py", line 413, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:UsersakcaiAppDataLocalProgramsPythonPython39libsite-packagesdjangocoremanagementbase.py", line 354, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:UsersakcaiAppDataLocalProgramsPythonPython39libsite-packagesdjangocontribauthmanagementcommandscreatesuperuser.py", line 79, in execute
    return super().execute(*args, **options)
  File "C:UsersakcaiAppDataLocalProgramsPythonPython39libsite-packagesdjangocoremanagementbase.py", line 398, in execute
    output = self.handle(*args, **options)
  File "C:UsersakcaiAppDataLocalProgramsPythonPython39libsite-packagesdjangocontribauthmanagementcommandscreatesuperuser.py", line 189, in handle
    self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)
  File "C:UsersakcaiAppDataLocalProgramsPythonPython39libsite-packagesdjangocontribauthmodels.py", line 163, in create_superuser
    return self._create_user(username, email, password, **extra_fields)
  File "C:UsersakcaiAppDataLocalProgramsPythonPython39libsite-packagesdjangocontribauthmodels.py", line 146, in _create_user
    user.save(using=self._db)
  File "C:UsersakcaiAppDataLocalProgramsPythonPython39libsite-packagesdjangocontribauthbase_user.py", line 67, in save
    super().save(*args, **kwargs)
  File "C:UsersakcaiAppDataLocalProgramsPythonPython39libsite-packagesdjangodbmodelsbase.py", line 726, in save
    self.save_base(using=using, force_insert=force_insert,
  File "C:UsersakcaiAppDataLocalProgramsPythonPython39libsite-packagesdjangodbmodelsbase.py", line 774, in save_base
    post_save.send(
  File "C:UsersakcaiAppDataLocalProgramsPythonPython39libsite-packagesdjangodispatchdispatcher.py", line 180, in send
    return [
  File "C:UsersakcaiAppDataLocalProgramsPythonPython39libsite-packagesdjangodispatchdispatcher.py", line 181, in <listcomp>
    (receiver, receiver(signal=self, sender=sender, **named))
  File "C:UsersakcaiOneDriveDesktopdeep_Stuffsgit_clonedPollingApplicationusermodels.py", line 27, in CreateProfile
    user = CustomUser.objects.get(username=instance)
  File "C:UsersakcaiAppDataLocalProgramsPythonPython39libsite-packagesdjangodbmodelsmanager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:UsersakcaiAppDataLocalProgramsPythonPython39libsite-packagesdjangodbmodelsquery.py", line 435, in get
    raise self.model.DoesNotExist(
user.models.DoesNotExist: CustomUser matching query does not exist.
PS C:UsersakcaiOneDriveDesktopdeep_Stuffsgit_clonedPollingApplication>
 

models.py:-

 from django.db import models
from django.contrib.auth.models import AbstractUser
from django.db.models.signals import post_save


# Create your models here.
class CustomUser(AbstractUser):
    email = models.EmailField(max_length=250, null=False, unique=True)
    name = models.CharField(max_length=50, null=False)
    username = models.CharField(max_length=50, null=False)
    password = models.CharField(max_length=15, null=False)
                                         
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['name', 'username']


class UserProfile(models.Model):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)

    def get_all_polls(self):
        from polls.models import PollQuestion
        pass


def CreateProfile(sender, instance, **kwargs):
    print("profile create too..")
    user = CustomUser.objects.get(username=instance)
    UserProfile.objects.create(user=user)


post_save.connect(CreateProfile, sender=CustomUser)
# following = models.ManyToManyField(CustomUser, symmetrical=False, null=True)
 

после этого я попытался войти на портал администратора и получить:- CustomUser matching query does not exist.

После этого я проверил базу данных, существует ли какой-либо пользователь или нет:-

 >>> from user.models import CustomUser
>>> u = CustomUser.objects.get(id=1)
>>> vars(u)
{'_state': <django.db.models.base.ModelState object at 0x000001C3C5B4CCA0>, 'id': 1, 'last_login': datetime.datetime(2021, 9, 21, 6, 43, 56, 565960, tzinfo=<UTC>), 'is_superuser': True, 'first_name': '', 'last_name': '', 'is_staff': True, 'is_active': True, 'date_joined': datetime.datetime(2021, 9, 21, 6, 28, 44, 123074, tzinfo=<UTC>), 'email': 'admin@gmail.com', 'name': 'admin', 'username': 'admin', 'password': 'pbkdf2_sha256$260000$SP9TyZ6VOMIFlRwvuvmDn4$7sak8fWf7QMTPfefoPMyQpLjYk3XpumRaJ5MMxq2lH4='}
>>>
 

Я не могу самостоятельно понять, что я делаю не так, пожалуйста, помогите выбраться из этого избавления.

Надеюсь скоро получить от вас весточку.. Заранее спасибо…

Ответ №1:

 user = CustomUser.objects.get(username=instance)
 

в этом мало смысла.

Вы пытаетесь получить пользователя, запросив, соответствует ли его имя пользователя экземпляру (пользовательскому пользователю).

Это приведет к тому, что Django построит пользовательский пользователь, поэтому ваш запрос будет выглядеть примерно так (если бы SQL был Python)

 if username == "<CustomUser: 3>":
 

что, очевидно, не приведет к появлению строк.

В общем случае вам не нужна как пользовательская модель пользователя, так и модель профиля пользователя. Возможно, переосмыслите свои модели баз данных, чтобы у вас была только пользовательская модель пользователя, и обязательно используйте AUTH_USER_MODEL настройки для ее подключения.

Комментарии:

1. Я добавил AUTH_USER_MODEL в setting.py..

2. Здорово. Тогда вам вообще не нужна отдельная модель пользовательского профиля.

3. @AKK я не понял, не могли бы вы, пожалуйста, добавить AUTH_USER_MODEL в settings.py тогда мне не нужно создавать отдельную модель профиля, почему?

4. Поскольку ваша пользовательская модель пользователя уже может содержать дополнительные поля (и методы), которые вы хотели бы использовать в своей модели профиля.