Django modeltranslation查询回退

10

我正在使用Django Modeltranslation来创建一个多语言网站。

当直接读取属性时,语言回退功能运作良好。 例如,如果当前语言是德语并且我打印对象的标题,如果未定义德语标题,我将看到英语标题。

我希望回退也能在查询中运作,但事实并非如此。 实际上,如果我执行以下操作:

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

如果未设置德语标题,则此方法将无法返回结果,而我希望它能返回英语标题为“hello”的对象。如何使其正常工作?谢谢!

你有读过文档吗?http://django-modeltranslation.readthedocs.org/en/latest/usage.html#fallback-languages - Hedde van der Heide
2
当然,回退语言部分解释了如何设置回退顺序。并且在访问字段或使用values()时有效,正如文档中所述。问题是,在使用查询集进行过滤时,回退不适用。文档中没有关于这个需求的说明,因此我想知道是否有办法实现这一点。 - sabrina
另外,MODELTRANSLATION_AUTO_POPULATE设置似乎不起作用。我将其设置为true,但使用TranslationModelForm保存对象时,翻译字段未填充:( - sabrina
1
谢谢你的提问,我也遇到了同样的问题!文档中也没有找到任何相关信息。你已经找到解决方法了吗? - steps
3个回答

4

很遗憾,上面的答案都是错误的。正确处理这种情况的方法是:

    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=""))
        )        
    )

其中 fr-fr 是我们正在使用的语言,en-gb 是我们的默认语言。这意味着获取那些目标语言标题包含可搜索字符串且目标语言标题已填充(非空)的行,或者目标语言标题为空且默认语言标题包含可搜索字符串的行。

因此,整个示例看起来像这样:

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的答案在某些情况下会产生错误的结果。 假设title_de ='ABC',title_en ='DEF',当前语言为德语。 对于搜索字符串“DEF”,我们得到了这一行,但不应该是因为用户看到的是“ABC”。

0

你必须确保你的模型已经在translation.py中注册了

from modeltranslation.translator import register, TranslationOptions
@register(YourModel)
class YourModel(TranslationOptions):
    pass

通过这种方式,所有查询都将根据其所在的语言返回相应的字段,这是因为在注册时创建了一个MultilingualManager。


0

这里需要明确查询所需的语言。在您的情况下:

from django.db.models import Q
# ...
# define your query like this: 
results = MyModel.objects.filter(Q(title_de = 'hello') | Q(title_en = 'hello'))
# supposing you have German and English languages set

为什么会这样呢?因为当您查询特定语言时,ModelTranslation 会保留它。否则,它将使用当前语言。

希望能对您有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接