Django,如何在多语言网站中创建后备语言?

时间:2014-02-03 08:20:51

标签: django database-design django-models

我正在尝试为多语言网站构建数据库模型。这是models.py

class Language(models.Model):
    name = models.CharField(max_length=2)

    def __unicode__(self):
        return self.name

class TranslationText(models.Model):
    content = models.TextField()
    language = models.ForeignKey(Language)
    remark = models.CharField(max_length=40, blank=True, default='')

    def __unicode__(self):
        return '('+self.language.name+' : ' + self.remark + ') ' + self.content[:30]

class i18nText(models.Model):
    translation = models.ManyToManyField(TranslationText, related_name='i18n_txt')
    remark = models.CharField(max_length=40, blank=True, default='')

    def __unicode__(self):
        return self.remark

class Region(models.Model):
    name = models.ForeignKey(i18nText, related_name='region_name')
    remark = models.CharField(max_length=32, default='', blank=False)

    def __unicode__(self):
        return self.remark

当我想用英语检索区域时,我这样做:

regs = TranslationText.objects.filter(language__name='en').exclude(i18n_txt__region_name=None).values_list('content', flat=True)

如果我想用德语检索,也是如此:

regs = TranslationText.objects.filter(language__name='de').exclude(i18n_txt__region_name=None).values_list('content', flat=True)

但是,我希望将英语作为“后备”语言。因此,如果某个语言的某个区域的数据库中没有数据,那么我的程序应该能够用英语选择文字。

我想要这样,因为大多数时代的文字在所有基于拉丁语言(特别是地区)中是相同的。所以我将数据输入减少到最低限度。

这有可能吗?怎么样?

1 个答案:

答案 0 :(得分:1)

您可以使用chain后备语言并获得第一名。

from itertools import chain

def myTrans(content, language_name):

    regs_lang = ( TranslationText
        .objects
        .filter(language__name=language_name, content = content)
        .exclude(i18n_txt__region_name=None)
        .values_list('content', flat=True) )

    regs_en = ( TranslationText
        .objects
        .filter(language__name='en', content = content)
        .exclude(i18n_txt__region_name=None)
        .values_list('content', flat=True) )

    return next( chain( regs_lang, regs_en ) )