首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django预取相关和django hvad

Django预取相关和django hvad
EN

Stack Overflow用户
提问于 2013-05-10 14:18:34
回答 2查看 775关注 0票数 0

我有以下模型,我使用django-hvad进行翻译

代码语言:javascript
复制
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')

任何时候我要酒店类型的列表;

多次进行如下查询

代码语言:javascript
复制
SELECT ••• FROM "foo_footype_translation" WHERE "foo_foo_type_translation"."master_id" = 159 LIMIT 1

每当我调用unicode时,我都必须应用prefetch_related。有没有办法做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2013-05-10 14:40:09

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

代码语言:javascript
复制
from hvad.manager import TranslationManager

class FooType(TranslatableModel):
    ...

    objects = TranslationManager()

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

票数 1
EN

Stack Overflow用户

发布于 2015-05-11 10:55:01

问这个问题已经有一段时间了,但由于没有得到明确的答案,一些东西已经改变了,另一些东西已经被改进了,我想我应该加一个。

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

代码语言:javascript
复制
qs = FooType.objects.language("en").all()

以这种方式加载的对象将被完全加载,包括它们在给定语言中的翻译。没有该语言翻译的对象将被过滤掉。

您可以省略该语言以使用当前语言(与Django的LocaleMiddleware结合使用时最有用):

代码语言:javascript
复制
qs = FooType.objects.language().all()

您也可以透明地使用转换后的字段,例如,这将返回当前语言中名称为foobar的所有对象:

代码语言:javascript
复制
qs = FooType.objects.language().filter(name__iexact='foobar')

您还可以使用'all'特殊代码一次搜索所有语言。以下行将返回任何语言的名称为foobar的所有对象(对于每种匹配的语言,将返回一次具有多种语言的名称的对象):

代码语言:javascript
复制
qs = FooType.objects.language('all').filter(name__iexact='foobar')

如果您运行Django 1.6或更高版本,还可以通过以下方式请求给定语言的对象列表,以及基于优先级的备用列表:

代码语言:javascript
复制
qs = FooType.objects.language("de").fallbacks("ja", "en")

这将获取所有对象,而不过滤任何对象。未翻译为德语的对象将加载为日语。如果它们在日语中不可用,则下一步尝试使用英语,如果也不可用,则将选择任意语言(在内部,这使用自连接,因此只发出一个请求)。

在任何情况下,要使用转换后的字段而不引起性能损失,您必须使用language()方法或make it implicit (仅限高级用户)。

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

希望能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16476297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档