2015-10-02 118 views
0

Django的用戶由於我的應用程序requeriments我需要的用戶類的像一個層次結構:擴展與子類

class CommonUser(models.Model): 
    user = models.OneToOneField(User,on_delete=models.CASCADE) 
    photo = models.ImageField(upload_to="profileImages",blank=True,null=True) 
    #HERE: Common properties for every user 
    class Meta: 
     abstract = True 

class Installer(CommonUser): 
    #HERE: Specific properties for Installer Companies 


class Administration(CommonUser): 
    #HERE: Specific properties for Administration 


class Client(CommonUser): 
    #HERE: Specific properties for Clients 

那麼,在view.py我需要得到輪廓圖像的用戶。我通過請求獲取用戶,所以我有一個models.User對象,我不知道它屬於它的女巫班。我不是能夠做到:

request.user.commonuser.photo

因爲用戶對象不必須與commonuser但安裝程序/管理/客戶端的任何OnetoOne關係......

任何想法?謝謝!

+0

一種方法可以爲CommonUser創建領域,如is_administration,is_client,is_installer默認值假,並將其設置爲true,當您創建的對象那種類型。 –

+0

你可能想把這些東西想象成配置文件而不是用戶。 –

回答

1

我移動,所以我不能對此進行測試,但...

我會設置你的所謂的「commonuser」 CommonUser.user領域的「related_name」。那麼你可以使用:

request.user.commonuser.photo 

像你已經。

我認爲問題在於你引用一個Django用戶對象來引用沒有正確名稱的向後關係。

0

首先,我認爲這個模型更像是一個Profile而不是User。如果你不介意使用1.9(和postgres),那麼這是一個JSON字段的完美用例。您可以使用常規查找進行過濾,不需要指定每種類型。這樣,您還可以以用戶可以一次完成多個角色的方式擴展用戶模型。我想起了另一件事是周圍的其他方法將它鏈接:

class UserProfile(models.Model): 
    user = models.OneToOneField(User,on_delete=models.CASCADE) 
    # ... 

class Installer(models.Model): 
    profile = models.ForeignKey(UserProfile, related_name='installer') 
    #HERE: Specific properties for Installer Companies 


class Administration(models.Model): 
    profile = models.ForeignKey(UserProfile, related_name='admin') 
    #HERE: Specific properties for Administration 


class Client(models.Model): 
    profile = models.ForeignKey(UserProfile, related_name='client') 
    #HERE: Specific properties for Clients