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

Comments

rodested (on October 11, 2011):
<p>Hello,</p> <p>I'd really like to use it. How should I deploy it?</p> <p>Thanks in anticipation.</p>

#

ungenio41 (on October 12, 2011):
<p>Well, first you put the above code in a backends.py file.</p> <p>Then, in your settings.py, put the following:</p> <pre>AUTHENTICATION_BACKENDS = ('backends.CustomUserModelBackend',) </pre> <p>Then you can do something like this in one of your models.py:</p> <pre>from django.contrib.auth.models import User from django.db import models class MyUser(User): picture = models.ImageField() </pre>

#

Please login first before commenting.