0

我正在開發Django 1.5中的一個學校數據庫系統,並且計劃使用AbstractUser(實際上是另一種抽象類型)的子類的許多不同用戶類型(Student,Staff,Parent) AbstractUser的子類)。我只是試圖將一個外部開發的應用程序添加到我的系統中,該系統在其某些模型中使用ForeignKey中的用戶,但由於我的用戶類型不是「用戶」實例,因此失敗。我無法將應用程序模型設置爲使用AbstractUser,因爲不能將抽象類用於外鍵。然後我正在考慮添加到我的settings.py AUTH_USER_MODEL = 'myapp.MyUser'和使用settings.AUTH_USER_MODEL來代替App中的ForeignKey用戶。但是,我有3種不同的用戶類型,所以也不能這樣做。在Django中爲兩種類型的用戶劃分AbstractUser

較早的原型使用Django 1.4,它不支持自定義用戶模型,因此引用了User,但是這需要對每個查詢進行額外的連接,這導致了相當複雜的查詢。這是我能繼續這樣做的唯一方式,還是有另一種解決方案?

回答

3

我已經成功地使用了以下解決方案:
1. models.py創建SchoolUser類 - 這將是你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 

這樣你不需要知道,它是哪種類型的用戶,只是實現你的邏輯。
我希望這足夠清楚,如果不讓我知道!

相關問題