- Author:
 - ungenio41
 - Posted:
 - September 10, 2011
 - Language:
 - Python
 - Version:
 - 1.3
 - 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
- Add Toggle Switch Widget to Django Forms by OgliariNatan 1 month, 4 weeks ago
 - get_object_or_none by azwdevops 5 months, 2 weeks ago
 - Mask sensitive data from logger by agusmakmun 7 months, 2 weeks ago
 - Template tag - list punctuation for a list of items by shapiromatron 1 year, 9 months ago
 - JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 1 year, 9 months ago
 
Comments
Hello,
I'd really like to use it. How should I deploy it?
Thanks in anticipation.
#
Well, first you put the above code in a backends.py file.
Then, in your settings.py, put the following:
Then you can do something like this in one of your models.py:
#
Please login first before commenting.