我有以下模型,我使用django-hvad进行翻译
class FooType(TranslatableModel):
code = models.CharField(max_length=255, unique=True)
translations = TranslatedFields(name=models.CharField(max_length=255))
def __unicode__(self):
return self.lazy_translation_getter('name')任何时候我要酒店类型的列表;
多次进行如下查询
SELECT ••• FROM "foo_footype_translation" WHERE "foo_foo_type_translation"."master_id" = 159 LIMIT 1每当我调用unicode时,我都必须应用prefetch_related。有没有办法做到这一点?
发布于 2013-05-10 14:40:09
编辑:从文档来看,看起来您应该使用TranslationManager
from hvad.manager import TranslationManager
class FooType(TranslatableModel):
...
objects = TranslationManager()参考:http://django-hvad.readthedocs.org/en/latest/public/queryset.html#translationqueryset
发布于 2015-05-11 10:55:01
问这个问题已经有一段时间了,但由于没有得到明确的答案,一些东西已经改变了,另一些东西已经被改进了,我想我应该加一个。
在hvad中使用可翻译对象的正常方法是同时请求获取翻译。您在README页面和documentation中也有几个示例,但它看起来像这样:
qs = FooType.objects.language("en").all()以这种方式加载的对象将被完全加载,包括它们在给定语言中的翻译。没有该语言翻译的对象将被过滤掉。
您可以省略该语言以使用当前语言(与Django的LocaleMiddleware结合使用时最有用):
qs = FooType.objects.language().all()您也可以透明地使用转换后的字段,例如,这将返回当前语言中名称为foobar的所有对象:
qs = FooType.objects.language().filter(name__iexact='foobar')您还可以使用'all'特殊代码一次搜索所有语言。以下行将返回任何语言的名称为foobar的所有对象(对于每种匹配的语言,将返回一次具有多种语言的名称的对象):
qs = FooType.objects.language('all').filter(name__iexact='foobar')如果您运行Django 1.6或更高版本,还可以通过以下方式请求给定语言的对象列表,以及基于优先级的备用列表:
qs = FooType.objects.language("de").fallbacks("ja", "en")这将获取所有对象,而不过滤任何对象。未翻译为德语的对象将加载为日语。如果它们在日语中不可用,则下一步尝试使用英语,如果也不可用,则将选择任意语言(在内部,这使用自连接,因此只发出一个请求)。
在任何情况下,要使用转换后的字段而不引起性能损失,您必须使用language()方法或make it implicit (仅限高级用户)。
此行为不是默认行为的原因是为了保持与现有代码库的兼容性:只要不调用language(),hvad就不会接触到您的查询。
希望能有所帮助。
https://stackoverflow.com/questions/16476297
复制相似问题