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' 错误?的主要内容,如果未能解决你的问题,请参考以下文章
初学者 Python:AttributeError:'list' 对象没有属性
AttributeError: 'RDD' 对象没有属性 'show'