Django prefetch_related在django hvad中

时间:2013-05-10 06:18:34

标签: django django-hvad

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

2 个答案:

答案 0 :(得分:1)

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

from hvad.manager import TranslationManager

class FooType(TranslatableModel):
    ...

    objects = TranslationManager()

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

答案 1 :(得分:0)

已经有一段时间了,但是由于没有得到确定的答案,有些事情已经改变,有些事情已经改进了,我想我会加一个。

在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就不会触及您的查询。

希望它有所帮助。