python - 创建 super 用户时出现 Django 错误,AttributeError : 'Manager' object has no attribute 'get_by_natural_key'

标签 python django django-manage.py manage.py

我使用的是 Django 版本 1.11.3 和 djangorestframework 版本 3.6.3。在创建 super 用户阶段使用以下命令:

python manage.py createsuperuser

此命令应该询问我的电子邮件和密码,尽管它确实询问我的电子邮件,但输入我的电子邮件后,我收到错误:

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "/home/shivams334/myapp2/lib/python3.5/site-packages/django/core/management/__init__.py", line 363, in execute_from_command_line
    utility.execute()
  File "/home/shivams334/myapp2/lib/python3.5/site-packages/django/core/management/__init__.py", line 355, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/shivams334/myapp2/lib/python3.5/site-packages/django/core/management/base.py", line 283, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/shivams334/myapp2/lib/python3.5/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 63, in execute
    return super(Command, self).execute(*args, **options)
  File "/home/shivams334/myapp2/lib/python3.5/site-packages/django/core/management/base.py", line 330, in execute
    output = self.handle(*args, **options)
  File "/home/shivams334/myapp2/lib/python3.5/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 121, in handle
    self.UserModel._default_manager.db_manager(database).get_by_natural_key(username)
AttributeError: 'Manager' object has no attribute 'get_by_natural_key'

我的 models.py 是这样的:

from django.db import models
from django.contrib.auth.models import AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
from django.contrib.auth.models import BaseUserManager

class UserProfileManager(object):
    """helps django work with our custom user model"""
    def create_user(self,email,name,password=None):
        if not email:
            raise ValueError('User must have email')
        email = self.normalize_email(email)
        user = self.model(email=email, name=name)

        user.set_password(password)
        user.save(using=self._db)

        return user
    def create_superuser(self,email,name,password):
        """creates and saves a new superuser with given details"""
        user = self.create_user(email,name,password)
        user.is_superuser = True
        user.is_staff = True
        user.save(using=self._db)   

class UserProfile(AbstractBaseUser, PermissionsMixin):

    """docstring for UserProfile"""
    email = models.EmailField(max_length=255, unique=True)
    name = models.CharField(max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = UserProfileManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['name']

    def get_full_name(self):
        """used to get a user full name"""
        return self.name

    def get_short_name():
        """used to get a users short name"""
        return self.name

    def __str__(self):
        """Django uses this when it needs to convert the object into string"""
        return self.email

我还更新了 settings.py 中的应用程序定义:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'rest_framework.authtoken',
    'profiles_api',
]
AUTH_USER_MODEL = 'profiles_api.UserProfile'

我尝试使用 python2 和 python3 执行此操作,但错误是相同的。

最佳答案

UserProfileManager 应该从 BaseUserManager 类继承,而不是从 object 继承:

class UserProfileManager(BaseUserManager):
...

您可以找到实现自定义用户模型的示例 here

关于python - 创建 super 用户时出现 Django 错误,AttributeError : 'Manager' object has no attribute 'get_by_natural_key' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44953338/

相关文章:

python - 在比较 pandas dataframe 中的列后,python 是否可以替换列表中的单词?

python - Ubuntu 说 virtualenv 没有安装但是 pip 说它是

python - 如何检查Python的AES解密错误?

python - Pycharm打不开manage.py任务

python - 修改manage.py用于开发和生产

python - 用于 Django 模型的 manage.py sql 命令 - Django

python - Redis 发布 - 'set' 的参数数量错误

django - 如何将相关对象中的字段附加到 Django 查询集?

django - 使用 Django 的 ORM 加速批量插入?

django - Google App Engine 教程问题 - 新数据存储模型