2016-08-18 79 views
0

現在我有兩個模型(在未來可能會更多):需要在模型之間關係的建議表

class UserProfile(models.Model): 

    first_name = models.CharField(_('first name'), max_length=30, blank=True) 
    last_name = models.CharField(_('last name'), max_length=30, blank=True) 
    birth_date = models.DateField(_('birth date'), null=True, blank=True) 


class TeamProfile(models.Model): 

    user = models.ManyToManyField(UserProfile) 
    name = models.CharField(_('company name'), max_length=30, blank=True) 
    info = models.TextField(_('information'), max_length=500, blank=True) 

這兩個Profiles應該能夠選擇其kinds_of_sports + mastery,即每個User或者Team可以分別發揮幾種運動並且具有不同的掌握程度,如:吉姆(足球 - >專業,排球 - >紐比)。

難道是正確的做一些事情,如:

class AbstractSports(models.Model): 
    KINDS_OF_SPORTS = (
     (1, _('football')), 
     (2, _('volleyball')), 
     (3, _('hockey')), 
    ) 

    MASTERY_CHOICES = (
     (1, _('newby')), 
     (2, _('amateur')), 
     (3, _('semi-pro')), 
     (4, _('pro')) 
    ) 

    kind_of_sport = models.IntegerField(_('kind of sport'), null=True, blank=True, choices=KINDS_OF_SPORTS) 
    mastery = models.IntegerField(_('mastery'), null=True, blank=True, choices=MASTERY_CHOICES) 

    class Meta: 
     abstract=True 

class UserSports(AbstractSports): 
    user = models.ForeignKey(UserProfile, on_delete=models.CASCADE) 

class TeamSports(AbstractSports): 
    team = models.ForeignKey(TeamProfile, on_delete=models.CASCADE) 

或有可能是一個更好的辦法嗎?

回答

1

我要一刺這個,我不知道如何改進的多,這是但它什麼開始通過我的頭腦裏,我是讀你的問題..

我不知道的團隊和用戶配置文件的差異或相似之處在於,但您可能希望將其作爲單個模型,然後有一個類型來定義其用戶或團隊。如果你想讓一個分配了用戶配置文件的團隊與自己建立關係。

class Profile(models.Model): 
    PROFILE_TYPES = (
     ('USER', 'User'), 
     ('TEAM', 'Team'), 
    ) 
    type = models.CharField(max_length=4, choices=PROFILE_TYPES) 
    first_name = models.CharField(_('first name'), max_length=30, blank=True) 
    last_name = models.CharField(_('last name'), max_length=30, blank=True) 
    birth_date = models.DateField(_('birth date'), null=True, blank=True) 
    user = models.ManyToManyField('Profile') #manytomany itself for teams that have profiles assigned to it 
    name = models.CharField(_('company name'), max_length=30, blank=True) 
    info = models.TextField(_('information'), max_length=500, blank=True) 

這時正好有一個單一的運動車型喜歡你了,只是與回輪廓

class Sports(models.Model): 
    KINDS_OF_SPORTS = (
     (1, _('football')), 
     (2, _('volleyball')), 
     (3, _('hockey')), 
    ) 

    MASTERY_CHOICES = (
     (1, _('newby')), 
     (2, _('amateur')), 
     (3, _('semi-pro')), 
     (4, _('pro')) 
    ) 
    kind_of_sport = models.IntegerField(_('kind of sport'), null=True, blank=True, choices=KINDS_OF_SPORTS) 
    mastery = models.IntegerField(_('mastery'), null=True, blank=True, choices=MASTERY_CHOICES) 
    profile = models.ForeignKey(Profile, on_delete=models.CASCADE)