AttributeError: объект "Менеджер" не имеет атрибута "get_by_natural_key" в Django?

Я использую Django '1.5c1'. У меня есть эта строка в моих настройках .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'

Ответ 1

Вы создали новую модель пользователя, но вы еще не указали менеджера для этой модели. Если вы еще не знакомы с менеджерами в 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 для вашей модели.