How to separate users (models) by admins and custo

2019-04-09 12:32发布

问题:

I would like to separate users of my Django app in two classes :
- Admin (users that use Django admin) - inherit from AbstractUser
- User (customers users) - inherit from AbstractBaseUser

I want to separate this two kinds of users because all fields of AbstractUser (is_staff, is_superuser, groups, permissions) are useless for my customer users and for permissions and group, I just want to implement something different. That why, I want to use AbstractBaseUser.

But for django admin users, AbstractUser class, it's just perfect and particularly with permissions feature.

class Admin(AbstractUser):
    pass

class Customer(AbstractBaseUser):
    pass

But now, is there a way to precise the User model used Admin for the django admin only? And use the Customer model for the rest of my apps.

Did I have to implement this from scratch :

class MyUser(AbstractBaseUser):
    username = models.CharField(max_length=30, unique=True)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField()
    is_active = models.BooleanField(default=False)

class Admin(MyUser, PermissionsMixin):
    is_staff = models.BooleanField(default=True)


class Customer(MyUser):
    # specific fields
    pass

With this implementation, if I set AUTH_USER_MODEL to User, permissions will not work because User has no permissions, is_superuser and is_staff fields.

And if a set it to Admin, I will not be able to authenticate Customers with django.contrib.auth.

So guys do you have a solution to this issue?

回答1:

The way Django offers to you seems to be much more flexible and future-adapted.

  1. You have a built-in User model, which you can override. Anyway, that model has permissions, groups, etc.
  2. If you need different field sets for different kinds of users, you create a OneToOne profile models.
  3. The separation point between your admins (actually, staff users) and regular customers is a User.is_staff attribute.

This way you gain a bunch of cool stuff (compared to two completely different user models):

  • Everything works out of the box: contrib.auth and contrib.admin modules.
  • Easy-customisable separation point: just override the admin_site.has_permission() and here you go.
  • You have the ability (but not obligation) to create users which are either customers and admins.
  • You can assign groups and permissions (different from your admins' ones) to your customers. Even you don't need it now, who knows.

As for drawbacks. The only one you've pointed out so far: your customers will be having (unused for now) permissions. Well, as they (as well as groups) are just separate tables, your customer data will have no performance of storage overhead.

That is to say, the overhead is negligeable compared to the benefits. I'd strongly recommend staying with Django's default User model and extending it if necessary.