2016-05-13 13 views
0

私はDjangoの翻訳者のためにウェブで作業しています。各翻訳者は、異なるレベルで異なる言語を話すことができます。翻訳者1はレベル「プロフェッショナル」で英語を話すことができ、翻訳者2はレベル「ネイティブ」で英語を話すことができます。同じクラスのDjangoオブジェクトで階層を設定する方法は?

Levelsは4種類あります。

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

さて、問題は何でしょう:

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()) 

とモデルLanguageLevel(レベルはモデルです)。問題は、翻訳者がレベル「標準」でEnglishと話したいと思っている場合、実際には、翻訳者がレベルで「標準」、「専門家」、または「ネイティブ」のいずれかのレベルにEnglishを話すようにしたいのです。 「ネイティブ」も「標準」を話すことができます。

このように私のプロジェクトには多くの状況がありますので、私はこれを簡素化したいと思います。

のでunknown < standard < professional < native。今私がすべての翻訳者が英語を話すのをstandardにしようとすると、professionalnativeも得たいと思う。

アドバイスをいただけますか?

答えて

2

charfieldの代わりにintegerfieldを使用できます。これにより、レベルで簡単にクエリが実行されます。

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

なぜレベルモデルが必要なのかわかりません。私はすべてをLanguageLevelに入れただけです。

あなたのクエリは次のようになります:

LanguageLevel.objects.filter(level__gte=1, language__name='English') 
関連する問題