0

我有以下模型,我正在使用 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 。有办法吗?

4

2 回答 2

1

编辑:通过查看文档,看起来您应该使用TranslationManager

from hvad.manager import TranslationManager

class FooType(TranslatableModel):
    ...

    objects = TranslationManager()

参考:http ://django-hvad.readthedocs.org/en/latest/public/queryset.html#translationqueryset

于 2013-05-10T06:40:09.343 回答
0

自从被问到这个问题已经有一段时间了,但由于没有得到明确的答案,有些事情已经改变,有些事情已经完善,我想我会添加一个。

在 hvad 中使用可翻译对象的正常方法是请求同时获取翻译。您在README页面和文档中也有几个示例,但看起来像这样:

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()方法或使其隐含(仅适用于高级用户)。

这种行为不是默认行为的原因是为了保持与现有代码库的兼容性:只要language()不调用,hvad 就不会触及您的查询。

希望能帮助到你。

于 2015-05-11T02:55:00.800 回答