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

pyn*_*ice 16 python django django-managers django-authentication django-1.5

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

AUTH_USER_MODEL = 'fileupload.galaxyuser'
Run Code Online (Sandbox Code Playgroud)

这是我的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'
Run Code Online (Sandbox Code Playgroud)

我想从Galaxyuser模型进行身份验证.但是,当我登录时,我收到此错误:

AttributeError: 'Manager' object has no attribute 'get_by_natural_key'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

编辑: 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'
Run Code Online (Sandbox Code Playgroud)

Sim*_*ser 36

您已创建新的用户模型,但尚未为该模型指定管理器.如果您还不熟悉Django中的管理员,我建议先阅读相关文档.正如Django 1.5所说(来源):

您还应该为User模型定义自定义管理器.如果您的用户模型定义的用户名和电子邮件字段与Django的默认用户相同,则可以安装Django的UserManager; 但是,如果您的用户模型定义了不同的字段,则需要定义一个扩展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'
Run Code Online (Sandbox Code Playgroud)

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

  • 我阅读了您提供的文档但我找不到解决方案.你能帮帮我吗? (2认同)
  • 这里有一些非常无用的评论-如果我们落在这里,那么我们就不理解文档。 (2认同)