Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django modeltranslation queries fallback

I'm using django modeltranslation for a multi-language site.

Language fallback works good when reading attributes directly. For example, if current language is German and I print object.title, if the German title is not defined I'll see the english title.

I would expect fallback to work also on queries, but that's not true. In fact, if i do something like

results = MyModel.objects.filter(title = 'hello')

this will get no results if the German title is not set, while I would like it to return the object with english title "hello".

How can I make this work?

Thanks in advance.

like image 656
sabrina Avatar asked Dec 11 '14 08:12

sabrina


1 Answers

Unfortunately answers above are wrong. The way to handle this case correct is

    queryset = queryset.filter(
        Q(
            Q(Q(title_fr_fr__icontains=search) & ~Q(title_fr_fr=""))
            |
            Q(Q(title_en_gb__icontains=search) & Q(title_fr_fr=""))
        )        
    )

Where fr-fr - is language we are working with now and en-gb - is our default language. This means get us those rows where title on target language contains searchable string AND title on target language is FILLED (not empty) OR where title on default language contains searchable string AND title on target language is empty.

So whole example will be looks like this:

from django.db.models import Q
###
default_lang = settings.LANGUAGE_CODE.replace("-", "_")
current_lang = get_language().replace("-", "_")

queryset = queryset.filter(
    Q(
        Q(Q(**{f'title_{current_lang}__icontains': search}) & ~Q(**{f'title_{current_lang}': ""}))
        |
        Q(Q(**{f'title_{default_lang}__icontains': search}) & Q(**{f'title_{current_lang}': ""}))
        )
    )

azuax answer gives wrong results in some cases. Suppose title_de = 'ABC', title_en = 'DEF' and current language de. And for search string "DEF" we get this row but shouldn't because user see "ABC"

like image 78
Слава Avatar answered Sep 18 '22 10:09

Слава