Django 模型翻译查询回退
Posted
技术标签:
【中文标题】Django 模型翻译查询回退【英文标题】:Django modeltranslation queries fallback 【发布时间】:2015-02-09 16:08:51 【问题描述】:我正在为多语言网站使用 django 模型翻译。
语言后备在直接读取属性时效果很好。 例如,如果当前语言是德语并且我打印 object.title,如果未定义德语标题,我将看到英文标题。
我希望回退也适用于查询,但事实并非如此。 事实上,如果我做类似的事情
results = MyModel.objects.filter(title = 'hello')
如果未设置德语标题,这将不会得到任何结果,而我希望它返回带有英文标题“hello”的对象。
我怎样才能做到这一点?
提前致谢。
【问题讨论】:
您阅读过文档吗? django-modeltranslation.readthedocs.org/en/latest/… 当然,后备语言部分解释了如何设置后备顺序。如文档中所述,它在访问字段或使用 values() 时有效。问题是使用查询集进行过滤时回退不适用。文档中没有任何关于这种需求的内容,所以我问是否有办法实现这一点。 另外,MODELTRANSLATION_AUTO_POPULATE 设置似乎不起作用。我将其设置为 true,但是使用 TranslationModelForm 保存对象时未填充翻译字段:( 感谢提问,我也有同样的问题!在文档中也找不到任何内容。你找到解决这个问题的方法了吗? 【参考方案1】:这里要做的是明确地查询期望的语言。在你的情况下:
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 会保留它。否则使用当前语言。
希望对你有帮助!
【讨论】:
【参考方案2】:您必须确保您的模型已在 translation.py 中注册
from modeltranslation.translator import register, TranslationOptions
@register(YourModel)
class YourModel(TranslationOptions):
pass
通过这种方式,所有完成的查询都将根据所使用的语言返回适当的字段,这是因为要注册它会创建一个 MultilingualManager
【讨论】:
【参考方案3】:不幸的是,上面的答案是错误的。正确处理这种情况的方法是
查询集 = 查询集.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 answer 在某些情况下会给出错误的结果。 假设 title_de = 'ABC',title_en = 'DEF' 和当前语言 de。 对于搜索字符串“DEF”,我们得到了这一行,但不应该因为用户看到“ABC”
【讨论】:
以上是关于Django 模型翻译查询回退的主要内容,如果未能解决你的问题,请参考以下文章