2013-05-10 44 views
0

我有以下的模型,我使用的Django hvad的翻譯Django的預取相關的和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 

我要申請prefetch_related任我呼籲統一。 有沒有辦法呢?

回答

1

編輯:從看文檔,它看起來像你應該使用TranslationManager

from hvad.manager import TranslationManager 

class FooType(TranslatableModel): 
    ... 

    objects = TranslationManager() 

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

+0

'高清get_query_set(個體經營): 回報超(FooTypeManager,個體經營).get_query_set()prefetch_related( '翻譯') ' 加載頁面 – tunaktunak 2013-05-10 07:27:03

+0

什麼是你的,你是叫prefetch_related表中還在做553個查詢出去之前刪除了這些額外查詢 – Thomas 2013-05-10 07:55:26

+0

我已經編輯我的答案與你 – Thomas 2013-05-10 07:59:46

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就不會觸及您的查詢。

希望它有幫助。