2016-04-11 41 views
1

我想知道如何使用through-modelsDjango中工作,以便能夠使屬性更舒適。我知道如何使用這個models獲得一些屬性,但它不直觀,而且很難記住如何獲取它們。如何在Django中使用直通模式訪問屬性?

例如在我的情況:

class UserProfile(models.Model): 
    user = models.OneToOneField(User, related_name='userprofile') 
    is_translator = models.BooleanField(default=False) 
    languages = models.ManyToManyField(Language, through='UserProfileLanguage') 

    def __unicode__(self): 
     return '{} {}'.format(self.user.first_name, self.user.last_name) 

    def __str__(self): 
     return '{} {}'.format(self.user.first_name, self.user.last_name) 


class Language(models.Model): 
    shortcut = models.CharField(max_length=40) 
    name = models.CharField(max_length=40) 

    def __str__(self): 
     return self.name 

class Level(models.Model): 
    LEVEL_CHOICES = (
     ('unknown','Unknown'), 
     ('standard','Standard level'), 
     ('professional','Professional level'), 
     ('native','Native speaker level'), 
    ) 
    name = models.CharField(max_length=40,choices=LEVEL_CHOICES, blank=False, null=False) 
    price_multiplier = models.FloatField() 

def __str__(self): 
    return self.get_name_display() 

class UserProfileLanguage(models.Model): 
    userprofile = models.ForeignKey(UserProfile) 
    language = models.ForeignKey(Language) 
    level = models.ForeignKey(Level) 

    class Meta: 
     unique_together = (('userprofile', 'language'),) 

因此,舉例來說,當我想知道一個User是否知道一個語言A,我必須這樣做:

print A in user.userprofile.userprofilelanguage_set.all() 

有沒有更簡單的方法?當我嘗試print例如user.userprofile.languages返回SolutionsForLanguagesApp.Language.None

回答

1

你不應該使用in搜索某些內容,因爲它可以通過在查詢集,這是緩慢的一切都被循環。您應該使用exists()

if UserProfileLanuage.objects.filter(user=user, language=A).exists(): 
    # do something 
相關問題