Django中出现AttributeError: 'Manager' object has no attribute 'get_by_natural_key'错误?

35

我正在使用 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'

我想从Galaxy用户模型进行身份验证。但是当我登录时,我会收到以下错误:

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

我做错了什么?

编辑: 追踪:

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文件吗? - masterofdestiny
粘贴跟踪回溯 - masterofdestiny
Django会为您创建ID,无需在模型中添加ID。如果您正在使用Django用户模型,则用户名必须是User模型的OneToOne字段,请查阅文档。 - masterofdestiny
我想做的唯一一件事就是使用内置的Django身份验证函数从GalaxyUser模型进行身份验证。但是在执行时出现了错误。谢谢。 - pynovice
4个回答

66

您已创建了一个新的用户模型,但尚未为该模型指定管理器。如果您还不熟悉Django中的管理器,建议先阅读有关此内容的文档。正如Django 1.5所说(来源):

  

您还应该为User模型定义自定义管理器。如果您的User模型定义了与Django默认User相同的用户名和电子邮件字段,则只需安装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变量。


1
在实施之后,我遇到了以下错误:类型对象'User'没有属性'USERNAME_FIELD'。 - pynovice
我已将我的模型从GalaxyUser重命名为User。 - pynovice
3
我阅读了你提供的文档,但没有找到解决方案。你能帮我吗? - pynovice
我尝试了这样的代码:class User(AbstractBaseUser),但是出现了另一个错误:FieldError: 类'User'中的本地字段'password'与基类'AbstractBaseUser'中的同名字段冲突。 - pynovice
3
这里有一些并不太有用的评论 - 如果我们已经到了这里,那么说明我们没有理解文档。 - jcansell
显示剩余4条评论

3

对我来说。。我忘记在manager的结尾添加括号了。

objects = UserManager

objects = UserManager()

我的问题是我甚至没有"objects = Usermanager()"或任何变体。在类的底部添加这个并确保使用"from django.contrib.auth.models import UserManager"解决了我的问题。这个答案帮助我注意到了它。 - CloudyGoat

1
如果你为你的 GalaxyUser 类编写了一个 UserManger 类,请确保将 `objects = UserManager()` 添加到其中。

1

你需要为自定义模型创建一个用户管理器。可以叫做GalaxyUserManager。然后将objects = GalaxyUserManager()添加到你的用户模型中。


哦,你救了我的一天。非常感谢你! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接