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