AttributeError: объект "Manager" не имеет атрибута "get By natural key" ошибка в Django?
Я использую 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'
что я делаю не так?
Edit: 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'
1 ответов
вы создали новую модель пользователя, но еще не указали менеджера для этой модели. Если вы еще не знакомы с менеджерами в Django я предлагаю читать документация по этому первый. Как говорит Django 1.5 (источник):
вы также должны определить пользовательский менеджер для вашей модели пользователя. Если ваша модель Пользователя определяет имя пользователя и поля электронной почты так же, как пользователь по умолчанию Django, вы можете просто установить UserManager Django; однако, если пользовательская модель определяет различные поля, необходимо определить пользовательский менеджер, который расширяет BaseUserManager, предоставляя два дополнительных метода:
create_user()
иcreate_superuser()
.
короче говоря, если ваша модель использует те же поля имени пользователя и электронной почты, что и Django's 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
переменной для вашей модели.