- September 10, 2011
- user profile backend auth modelbackend subclass
- 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