2016-04-11 8 views
1

私はthrough-modelsと一緒に働く方法を理解して、Djangoに属性をより快適にすることができます。私はこのmodelsを使用していくつかの属性を取得する方法を知っていますが、直感的ではなく、取得方法を覚えておくのは難しいです。Djangoでthrough-modelを使って属性にアクセスするには?

私の場合は例えば

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