0

I am trying to build a database model for a multilingual website. This is 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

When I want to retrieve regions in english I do this:

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

The same if I want to retrieve in German:

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

However, I would like to have english as a "fallback" language. So, in case there is no data in the database for a certain region for a certain language then my program should be able to pick literals in English.

I want it like this because most of the times literals are the same in all latin-based languages (especially regions). So I reduce data entry to the minimum.

Is that possible, at all? How?

xpanta
  • 8,124
  • 15
  • 60
  • 104

1 Answers1

1

You can chain fallback language and get first.

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 ) )
dani herrera
  • 48,760
  • 8
  • 117
  • 177
  • Thanks. It works! One final question. Does that mean that if there are 10 regions, I will have to run 2x10=20 queries? – xpanta Feb 03 '14 at 10:08
  • 1
    @xpanta, second query is not executed if first one returns models. Remember you [can store results in cache](http://stackoverflow.com/questions/4631865/caching-query-results-in-django). – dani herrera Feb 03 '14 at 15:17