如何在同一个类的Django对象上设置层次结构?

时间:2016-05-13 21:15:08

标签: python django

我正在为Django的翻译工作。每个翻译人员可以在不同级别讲不同的语言。因此,翻译人员1可以在专业级别上讲英语,翻译人员2可以在级别上讲英语'本地语言。

有四种不同的Levels。 (等级是模型)

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

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

现在问题是什么。问题是,如果我想获得,例如,翻译人员在级别'标准'上发言,事实上,我希望翻译人员在级别上讲English&# 39;标准','专业'或者' native'因为那些能说“本地人”的人可以说'标准'太。

我的项目中有很多这样的情况,所以我想简化一下。

所以English< unknown< standard< professional。现在,如果我尝试让所有翻译人员在native级别上讲英语,我也想获得standardprofessional

你可以给我建议吗?

1 个答案:

答案 0 :(得分:2)

您可以使用整数字段而不是字段。这使得查询级别变得简单。

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

我不确定你为什么需要Level模型。我会把所有内容都放到LanguageLevel中。

您的查询将如下所示:

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