我正在为一个多语言网站使用 django modeltranslation。
语言回退在直接读取属性时效果很好。 例如,如果当前语言是德语并且我打印 object.title,如果未定义德语标题我将看到英文标题。
我希望回退也适用于查询,但事实并非如此。 事实上,如果我做类似的事情
results = MyModel.objects.filter(title = 'hello')
如果未设置德语标题,这将不会得到任何结果,而我希望它返回英文标题为“hello”的对象。
我怎样才能让它工作?
提前致谢。
最佳答案
不幸的是,上面的答案是错误的。正确处理这种情况的方法是
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 在某些情况下会给出错误的结果。 假设 title_de = 'ABC', title_en = 'DEF' 和当前语言 de。 对于搜索字符串“DEF”,我们得到这一行但不应该因为用户看到“ABC”
关于python - Django 模型翻译查询回退,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27418377/