Это было довольно давно, так что был задан вопрос, но, как это не получил определенный ответ, некоторые вещи изменились, а другие были усовершенствованы, я решил, что добавлю.
Обычный способ работы с переводимыми объектами в 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 не касается вашего запроса.
Надеюсь, это поможет.
определение функции get_query_set (Я):. возвращение супер (FooTypeManager, самость) .get_query_set() prefetch_related ('перевод') ' еще делает 553 запросов при загрузке страницы – tunaktunak
что было вашей prefetch_related стол, который вы призывающую к до этого удалены эти дополнительные запросы – Thomas
Я отредактировал мой ответ с другим подходом для вас – Thomas