2016-05-13 1 views
0

Ich arbeite an einem Web für Übersetzer in Django. Jeder Übersetzer kann verschiedene Sprachen auf verschiedenen Ebenen sprechen. So kann Übersetzer 1 Englisch auf der Ebene "professionell" sprechen, Übersetzer 2 kann Englisch auf der Ebene "Muttersprache" sprechen.Wie wird die Hierarchie für Django-Objekte der gleichen Klasse festgelegt?

Es gibt vier verschiedene Levels. (Stufe ist ein Modell)

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, 
          help_text=_('Choose a level')) 

    def __str__(self): 
     return '{}'.format(self.get_name_display()) 

Und Modell LanguageLevel:

class LanguageLevel(models.Model): 
    language = models.ForeignKey(Language, 
           help_text=_('Choose a language'), related_name='language_levels') 
    level = models.ForeignKey(Level, 
           help_text=_('Choose a level of the language')) 
    price_multiplier = models.FloatField(default=0.0, 
             help_text=_('Type a price multiplier')) 

    def __str__(self): 
     return '{}: {}'.format(self.language, self.level) 

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

Nun, was das Problem ist. Das Problem ist, dass ich, wenn ich zum Beispiel einen Übersetzer English auf Level "Standard" sprechen möchte, in der Tat Übersetzer English auf Ebene entweder 'Standard', 'Professional' oder 'Native' bekommen möchte, weil diejenigen, die kann sprechen "nativ" kann auch "Standard" sprechen.

Es gibt viele Situationen in meinem Projekt, so möchte ich dies vereinfachen.

So unknown < standard < professional < native. Jetzt, wenn ich versuche, alle Übersetzer sprechen Englisch auf standard Ebene zu bekommen, möchte ich auch und native bekommen.

Können Sie mir einen Rat geben?

Antwort

2

Sie können ein integerfield anstelle von charfield verwenden. Dies macht die Abfrage auf der Ebene einfach.

LEVEL_CHOICES = (
    (0, _('Unknown')), 
    (1, _('Standard level')), 
    (2, _('Professional level')), 
    (3, _('Native speaker level')), 
) 

level = models.IntegerField(choices=LEVEL_CHOICES, default=0, 
         help_text=_('Choose a level')) 

Ich bin mir nicht sicher, warum Sie das Level-Modell benötigen. Ich hätte alles in LanguageLevel gebracht.

Ihre Abfrage würde wie folgt aussehen:

LanguageLevel.objects.filter(level__gte=1, language__name='English') 
Verwandte Themen