Login

Multiple User subclasses custom Auth backend

Author:
ungenio41
Posted:
September 10, 2011
Language:
Python
Version:
1.3
Tags:
user profile auth subclass backend modelbackend
Score:
0 (after 0 ratings)

A project I'm working on requires multiple different classes of users, all with different fields/attributes. Having a single UserProfile class with a generic relation was a complete pain in practice.

So, I changed my classes to all subclass User directly and then used django-model-utils to create a custom ModelBackend that returns the appropriate class when accessing request.user.

The InheritanceQuerySet manager provided by django-model-utils makes it all possible and with only a single database query.

No need to add anything directly to the User class, by the way. Just subclass it directly with each of your custom classes:

class CustomUser1(User):
    field1 = models.CharField(...)

class CustomUser2(User):
    field2 = models.CharField(...)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
from model_utils.managers import InheritanceQuerySet


class CustomUserModelBackend(ModelBackend):
    def get_user(self, user_id):
        try:
            return InheritanceQuerySet(User).select_subclasses().get(pk=user_id)
        except User.DoesNotExist:
            return None

More like this

  1. ModelMixin by eallik 4 years, 3 months ago
  2. UserForeignKey by hawkeye 7 years ago
  3. Using descriptors for lazy attribute caching by djypsy 7 years, 6 months ago
  4. ModelList class by facundo_olano 3 years, 12 months ago
  5. Full Model History by willhardy 6 years, 2 months ago

Comments

rodested (on October 11, 2011):

Hello,

I'd really like to use it. How should I deploy it?

Thanks in anticipation.

#

ungenio41 (on October 12, 2011):

Well, first you put the above code in a backends.py file.

Then, in your settings.py, put the following:

AUTHENTICATION_BACKENDS = ('backends.CustomUserModelBackend',)

Then you can do something like this in one of your models.py:

from django.contrib.auth.models import User
from django.db import models


class MyUser(User):
    picture = models.ImageField()

#

Please login first before commenting.