0

Я разрабатываю систему школьной базы данных в Django 1.5 и планирую иметь несколько разных типов пользователей (Student, Staff, Parent), которые подклассы AbstractUser (на самом деле, еще один абстрактный подкласс AbstractUser). Я просто пытался добавить внешнее приложение в свою систему, которое использует User in a ForeignKey для некоторых из его моделей, однако это не удается, так как мой тип пользователя не является экземпляром пользователя. Я не могу настроить модели приложений на использование AbstractUser, так как нельзя использовать абстрактные классы для внешних ключей. Затем я рассматривал возможность добавления в мои настройки.py AUTH_USER_MODEL = 'myapp.MyUser' и использования settings.AUTH_USER_MODEL вместо User для ForeignKey в приложении. Тем не менее, у меня есть 3 разных типа пользователя, поэтому я не могу этого сделать.Подклассификация AbstractUser в Django для двух типов пользователей

Раннее прототип, используемый Django 1.4, который не поддерживает пользовательские модели пользователей, следовательно, имел ссылку на пользователя вместо этого, но для этого требовалось дополнительное соединение для каждого запроса, что приводило к довольно сложным запросам. Это единственный способ, которым я могу идти дальше, или есть другое решение?

ответ

3

Я успешно использовал следующее решение:
1. Создать SchoolUser класс в models.py - это будет ваш AUTH_USER_MODEL класс

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

2. Создать users.py файл и поместить всю логику там пользователи , Есть один абстрактный класс, все остальные наследовать и который будет осуществлять фабричный метод:

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 

Примеры детских классов (также перейти к users.py файл):

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

Фототуры где происходит волшебство ;)

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

Таким образом, вам не нужно знать, какой тип пользователя он использует, просто реализуйте свою логику.
Надеюсь, это достаточно ясно, если не дайте мне знать!