Python 如何在Django中使用直通模型访问属性?

Python 如何在Django中使用直通模型访问属性?,python,django,django-models,Python,Django,Django Models,我想弄清楚如何通过Django中的模型使用,以使属性更舒适。我知道如何使用这个模型获取一些属性,但这并不直观,而且很难记住如何获取它们 例如,在我的案例中: class UserProfile(models.Model): user = models.OneToOneField(User, related_name='userprofile') is_translator = models.BooleanField(default=False) languages

我想弄清楚如何通过
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'),)
例如,当我想知道一个
用户是否知道一种语言
a
,我必须这样做:

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

有没有更简单的方法?例如,当我尝试打印
user.userprofile.languages
时,它会返回
SolutionsForLanguagesApp.Language.None
您不应该在
中使用
来搜索某个内容,因为它可能会在查询集中的所有内容中循环,这很慢。您应该使用
exists()

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