35

I am using Django '1.5c1'. I have this line in my settings.py:

AUTH_USER_MODEL = 'fileupload.galaxyuser'

Here's my Galaxyuser model:

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'

I want to authenticate from Galaxyuser model. However when I login I am getting this error:

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

What am I doing wrong?

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'
pynovice
  • 7,424
  • 25
  • 69
  • 109

4 Answers4

66

You have created a new user model but you have not yet specified a manager for that model. If you're not yet familiar with managers in Django I suggest reading the documentation on that first. As the Django 1.5 say (source):

You should also define a custom manager for your User model. If your User model defines username and email fields the same as Django's default User, you can just install Django's UserManager; however, if your User model defines different fields, you will need to define a custom manager that extends BaseUserManager providing two additional methods: create_user() and create_superuser().

In short, if your model uses the same username and email fields as Django's User model then you can write:

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'

Alternatively, you'll need to subclass BaseUserManager (also in django.contrib.auth.models) and implement the desired methods. Then, you'll need to assign it to the objects variable for your model.

Simeon Visser
  • 118,920
  • 18
  • 185
  • 180
  • 1
    I am getting this error after implementing this: type object 'User' has no attribute 'USERNAME_FIELD' – pynovice Feb 06 '13 at 08:47
  • I have renamed my model to User from GalaxyUser. – pynovice Feb 06 '13 at 08:48
  • 3
    I read the documentation you provided but I couldn't find the solution. Can you help me on this? – pynovice Feb 06 '13 at 08:59
  • I have solved this using: USERNAME_FIELD = 'username' but I get another error: 'User' object has no attribute 'check_password' – pynovice Feb 06 '13 at 09:08
  • I think you can solve that by extending your user model from `AbstractBaseUser`: https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#django.contrib.auth.models.AbstractBaseUser – Simeon Visser Feb 06 '13 at 09:27
  • Did like this: class User(AbstractBaseUser) but got another error: FieldError: Local field 'password' in class 'User' clashes with field of similar name from base class 'AbstractBaseUser' – pynovice Feb 06 '13 at 09:30
  • Since I want to authenticate from another table I don't want to subclass AbstractBaseUser. – pynovice Feb 06 '13 at 09:33
  • 3
    some pretty unhelpful comments here - if we've landed here, then we're not understanding the docs. – jcansell Sep 05 '18 at 11:47
  • The link to the managers docs is outdated; here is the (2020) new version: `https://docs.djangoproject.com/en/3.0/topics/db/managers/` – RoyM Jun 24 '20 at 17:58
1

for me.. I had forgotten to add Parentheses end of manager..

objects = UserManager

objects = UserManager()
  • My problem was I didn't even have "objects = Usermanager()" or any variation of it. Adding this close to the bottom of the class and making sure to use "from django.contrib.auth.models import UserManager" solved it for me. This answer helped me notice it. – CloudyGoat Mar 17 '23 at 14:20
0

If you have a UserManger class for your GalaxyUser class, make sure you add objects = UserManager() to that

Tomerikoo
  • 18,379
  • 16
  • 47
  • 61
Dr. Tech
  • 23
  • 3
0

You have to create a user manager for the custom model. Maybe GalaxyUserManager. Then add objects = GalaxyUserManager() to your user model

Okwesi
  • 21
  • 3