AttributeError:'Manager' 对象在 Django 中没有属性 'get_by_natural_key' 错误?

Posted

技术标签:

【中文标题】AttributeError:\'Manager\' 对象在 Django 中没有属性 \'get_by_natural_key\' 错误?【英文标题】:AttributeError: 'Manager' object has no attribute 'get_by_natural_key' error in Django?AttributeError:'Manager' 对象在 Django 中没有属性 'get_by_natural_key' 错误? 【发布时间】:2013-01-21 07:10:13 【问题描述】:

我正在使用 Django '1.5c1'。我的 settings.py 中有这一行:

AUTH_USER_MODEL = 'fileupload.galaxyuser'

这是我的Galaxyuser 模型:

class GalaxyUser(models.Model):
    id = models.IntegerField(primary_key=True)
    create_time = models.DateTimeField(null=True, blank=True)
    update_time = models.DateTimeField(null=True, blank=True)
    email = models.CharField(max_length=765)
    password = models.CharField(max_length=120)
    external = models.IntegerField(null=True, blank=True)
    deleted = models.IntegerField(null=True, blank=True)
    purged = models.IntegerField(null=True, blank=True)
    username = models.CharField(max_length=765, blank=True)
    form_values_id = models.IntegerField(null=True, blank=True)
    disk_usage = models.DecimalField(null=True, max_digits=16, decimal_places=0, blank=True)
    class Meta:
        db_table = u'galaxy_user'

我想通过 Galaxyuser 模型进行身份验证。但是,当我登录时出现此错误:

AttributeError: 'Manager' object has no attribute 'get_by_natural_key'

我做错了什么?

编辑: Traceback:

Traceback:
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response
  115.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/zurelsoft/workspace/genalytics/fileupload/backend.py" in login_backend
  26.         user = authenticate(username=username, password=password)
File "/usr/local/lib/python2.6/dist-packages/django/contrib/auth/__init__.py" in authenticate
  59.             user = backend.authenticate(**credentials)
File "/usr/local/lib/python2.6/dist-packages/django/contrib/auth/backends.py" in authenticate
  16.             user = UserModel.objects.get_by_natural_key(username)

Exception Type: AttributeError at /login_backend/
Exception Value: 'Manager' object has no attribute 'get_by_natural_key'

【问题讨论】:

能否提供你的settings.py文件 将曲目也粘贴回去 查看我更新的问题。 django 将为您创建 id,无需在您的模型中添加 id,如果您使用 django 用户模型,则用户名必须是 OneToOne 字段,以便用户模型检查文档 我唯一想做的就是使用内置的 Django 身份验证功能从 GalaxyUser 模型进行身份验证。我在做的时候出错了。谢谢 【参考方案1】:

您已创建新用户模型,但尚未为该模型指定管理员。如果您还不熟悉 Django 中的管理器,我建议您先阅读documentation on that。正如 Django 1.5 所说 (source):

您还应该为您的用户模型定义一个自定义管理器。如果你的用户模型定义的用户名和电子邮件字段与 Django 的默认用户相同,你可以安装 Django 的 UserManager;但是,如果您的 User 模型定义了不同的字段,您将需要定义一个扩展 BaseUserManager 的自定义管理器,提供两个额外的方法:create_user()create_superuser()

简而言之,如果您的模型使用与 Django 的 User 模型相同的用户名和电子邮件字段,那么您可以这样写:

from django.contrib.auth.models import UserManager

class GalaxyUser(models.Model):
    id = models.IntegerField(primary_key=True)
    create_time = models.DateTimeField(null=True, blank=True)
    update_time = models.DateTimeField(null=True, blank=True)
    email = models.CharField(max_length=765)
    password = models.CharField(max_length=120)
    external = models.IntegerField(null=True, blank=True)
    deleted = models.IntegerField(null=True, blank=True)
    purged = models.IntegerField(null=True, blank=True)
    username = models.CharField(max_length=765, blank=True)
    form_values_id = models.IntegerField(null=True, blank=True)
    disk_usage = models.DecimalField(null=True, max_digits=16, decimal_places=0, blank=True)

    objects = UserManager()

    class Meta:
        db_table = u'galaxy_user'

或者,您需要继承 BaseUserManager(也在 django.contrib.auth.models 中)并实现所需的方法。然后,您需要将其分配给模型的 objects 变量。

【讨论】:

我在实现这个后得到这个错误:类型对象'User'没有属性'USERNAME_FIELD' 我已将我的模型从 GalaxyUser 重命名为 User。 我阅读了您提供的文档,但找不到解决方案。你能帮我解决这个问题吗? 我已经解决了这个问题:USERNAME_FIELD = 'username' 但我得到另一个错误:'User' object has no attribute 'check_password' 这里有一些非常无用的 cmets - 如果我们已经登陆这里,那么我们不理解文档。【参考方案2】:

如果您的GalaxyUser 课程有一个UserManger 课程,请确保将objects = UserManager() 添加到该课程中

【讨论】:

以上是关于AttributeError:'Manager' 对象在 Django 中没有属性 'get_by_natural_key' 错误?的主要内容,如果未能解决你的问题,请参考以下文章

AttributeError:“模块”对象没有属性“作者”

初学者 Python:AttributeError:'list' 对象没有属性

AttributeError:“字节”对象没有属性“告诉”

AttributeError: 'RDD' 对象没有属性 'show'

AttributeError:“NumpyArrayIterator”对象没有属性“类”

AttributeError:模块 'dbus' 没有属性 'lowlevel'