- September 10, 2011
- 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
- Serializer factory with Django Rest Framework by julio 5 months, 3 weeks ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 6 months, 1 week ago
- Help text hyperlinks by sa2812 7 months, 1 week ago
- Stuff by NixonDash 9 months, 2 weeks ago
- Add custom fields to the built-in Group model by jmoppel 11 months, 2 weeks ago