Subclassing AbstractUser in Django for two types of users

后端 未结 1 551
[愿得一人]
[愿得一人] 2021-01-07 08:18

I\'m developing a school database system in Django 1.5, and was planning on having a number of different user types (Student, Staff, Parent) which subclass AbstractUser (act

相关标签:
1条回答
  • 2021-01-07 08:59

    I have successfully used the following solution:
    1. Create SchoolUser class in models.py - this will be your AUTH_USER_MODEL class

    TYPES = (('Student', 'Student'), ('Staff', 'Staff'), ('Parent', 'Parent'), )
    class SchoolUser(AbstractUser):
        type = models.CharField(max_length=10, choices=TYPES, default='Student')
    

    2. Create users.py file and put whole users logic there. Have one abstract class that all others inherit from and which will implement the factory method:

    class UserManager(object):
        def __init__(self, user):
            self.user = user
    
        @classmethod
        def factory(cls, user):
            """
            Dynamically creates user object
            """
            if cls.__name__.startswith(user.type):  # Children class naming convention is important
                return cls(user)
            for sub_cls in cls.__subclasses__():
                result = sub_cls.factory(user)
                if result is not None:
                    return result
    

    Sample children classes (also go to users.py file):

    class StudentUser(UserManager):
        def do_something(self):
            pass
    class StaffUser(UserManager):
        def do_something(self):
            pass
    class ParentUser(UserManager):
        def do_something(self):
            pass
    

    Views is where the magic happens ;)

    def my_view(request):
        school_user = UserManager.factory(request.user)
        if school_user.do_something:  # each class can have different behaviour
    

    This way you don't need to know, which type of user it is, just implement your logic.
    I hope this is clear enough, if not let me know!

    0 讨论(0)
提交回复
热议问题