Джанго связан с предварительной выборкой и Джанго Хвадом
У меня есть следующая модель, и я использую Джанго-Хвад для переводов
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 каждый раз, когда я призываю Unicode. Есть ли способ для этого?
2 ответа
РЕДАКТИРОВАТЬ: глядя на документы, похоже, что вы должны использовать TranslationManager
from hvad.manager import TranslationManager
class FooType(TranslatableModel):
...
objects = TranslationManager()
REF: http://django-hvad.readthedocs.org/en/latest/public/queryset.html
Прошло довольно много времени с тех пор, как об этом спросили, но так как он не получил однозначного ответа, некоторые вещи изменились, а другие были уточнены, я решил добавить один.
Обычный способ работы с переводимыми объектами в hvad - это запросить выборку перевода. У вас есть пара примеров на странице README и в документации, но это выглядит так:
qs = FooType.objects.language("en").all()
Загруженные таким образом объекты будут полностью загружены, включая их перевод на данный язык. Объекты без перевода на этом языке отфильтровываются.
Вы можете опустить язык для использования текущего языка (наиболее полезно в сочетании с LocaleMiddleware от Django):
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()
метод или сделать его неявным (только для опытных пользователей).
Причина, по которой это поведение не по умолчанию, состоит в том, чтобы поддерживать совместимость с существующей кодовой базой: до language()
не называется, hvad не трогает ваш запрос.
Надеюсь, поможет.