Django中AttributeError: 'Manager'对象没有'get_by_natural_key'属性的错误?
我正在使用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:
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'
4 个回答
1
如果你有一个 UserManager
类来管理你的 GalaxyUser
类,记得在里面加上 objects = UserManager()
这一行。
5
对我来说……我忘了在管理器的最后加上括号
。
objects = UserManager
objects = UserManager()
69
你创建了一个新的用户模型,但还没有为这个模型指定一个管理器。如果你对Django中的管理器还不太了解,建议先看看这部分文档。正如Django 1.5所说的(来源):
你应该为你的用户模型定义一个自定义的管理器。如果你的用户模型的用户名和邮箱字段和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'
另外,你需要继承BaseUserManager
(也在django.contrib.auth.models
中),并实现所需的方法。然后,你需要把它赋值给你的模型的objects
变量。