2016-04-11 3 views
1

Ich bin dran herauszufinden, wie man mit through-models in Django arbeiten, um Attribute bequemer zu bekommen. Ich weiß, wie man einige Attribute mit dieser models bekommen kann, aber es ist nicht intuitiv und es ist schwer sich daran zu erinnern, wie man sie bekommt.Wie kann man in Django auf Attribute zugreifen, die ein Durchgangsmodell verwenden?

Zum Beispiel in meinem Fall:

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'),) 

So zum Beispiel, wenn ich, ob ein User Sprache A weiß wissen wollen, ich habe dies zu tun:

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

einen gibt es einfacher Weg? Als ich nach print zum Beispiel versuchen user.userprofile.languages gibt es SolutionsForLanguagesApp.Language.None

Antwort

1

Sie nicht in etwas zu suchen, verwenden sollten, weil es durch alles, was in der queryset Looping werden, was langsam ist. Sie sollten exists():

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