2013-05-10 3 views
0

я следующая модель и я использую Джанго-Hvad для переводаДжанго упреждающие связаны и Джанго 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

EDIT: Глядя на документы, похоже, что вы должны использовать 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 ('перевод') ' еще делает 553 запросов при загрузке страницы – tunaktunak

+0

что было вашей prefetch_related стол, который вы призывающую к до этого удалены эти дополнительные запросы – Thomas

+0

Я отредактировал мой ответ с другим подходом для вас – Thomas

0

Это было довольно давно, так что был задан вопрос, но, как это не получил определенный ответ, некоторые вещи изменились, а другие были усовершенствованы, я решил, что добавлю.

Обычный способ работы с переводимыми объектами в hvad - запросить также перевод. У вас есть несколько примеров в README страницы и documentation, а также, но это выглядит следующим образом:

qs = FooType.objects.language("en").all() 

Объекты, загруженные таким образом, будут полностью загружены, в том числе их перевода на данном языке. Объекты без перевода на этом языке отфильтровываются.

Вы можете опустить язык, чтобы использовать текущий язык (наиболее полезны в сочетании с 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 не касается вашего запроса.

Надеюсь, это поможет.

Смежные вопросы