2016-07-05 108 views
1

如何創建兩個User類型有很多共同的屬性?據我所知,創建兩種User的最佳做法是創建2 UserProfiles。我有類型 - FirmPerson。所以我決定創建兩個UserProfiles多種類型的用戶有很多共同的屬性

class FirmProfile(models.Model): 
    user = models.OneToOneField(User, related_name='firmprofile') 
    prefered_times = ... 
    favourite_food = ... 

class PersonProfile(models.Model): 
    user = models.OneToOneField(User, related_name='personprofile') 
    prefered_times = ... 
    favourite_food = ... 

現在,我正在尋找一種方法,我就不必寫兩次的屬性。可能嗎?

編輯:我創建了這一點,但我不知道這是否是最好的選擇,因爲每個用戶配置將有兩個配置文件 - 公司和個人

class UserProfile(User): 
    user = models.OneToOneField(User, related_name='userprofile') 

    TYPE_OF_USER_CHOICES = (('firm','Firm'), 
          'person','Person') 

    type_of_user = models.CharField(max_length=40, choices=TYPE_OF_USER_CHOICES) 

class FirmProfile(models.Model): 
    user = models.OneToOneField(User, related_name='firmprofile') 

class PersonProfile(models.Model): 
    user = models.OneToOneField(User, related_name='personprofile') 
+0

檢查用戶類型約與個人或公司現場只有一種模式是什麼?或者在UserProfile中設置所有屬性。那麼做測試就更容易了。如果你有UserProfile,我不認爲你需要有FirmProfile和PersonProfile。 – Gaetan

回答

1

有很多方法可以做到這一點https://docs.djangoproject.com/en/1.9/topics/db/models/#model-inheritance

最簡單的將創建abstract模型

class BaseProfile(models.Model): 
    prefered_times = ... 
    favourite_food = ... 

    class Meta: 
     abstract = True 

class FirmProfile(BaseProfile): 
    user = models.OneToOneField(User, related_name='firmprofile') 
    ... # all custom fields can be defined here 

class PersonProfile(BaseProfile): 
    user = models.OneToOneField(User, related_name='personprofile') 
    ... 

回答評論 你可以這樣

def get_user_type(user): 
    if getattr(user, 'firmprofile', None): 
     return 'firm' 
    elif getattr(user, 'personprofile', None): 
     return 'person' 
    else: 
     return None 
+0

這看起來不錯,但可能有一個問題。例如,如果我在某個視圖中與用戶合作,並且我想訪問他們的UserProfile?我怎麼知道它是公司還是個人?如果'user.type'='人'不會工作... –