Двухуровневая предварительная выборка по обратному внешнему ключу с помощью select_subclasses
Я работал над двухуровневым обратным иностранным ключом со вторым уровнем, унаследовавшим подклассы. Я использую django-model-utils для наследования. Я продолжал настраивать команды предварительной выборки без использования, пока не нашел ответ для обхода набора запросов в этом посте. Объект предварительной выборки с несколькими уровнями обратного поиска
Мои вопросы
1) Я не вижу внутреннего соединения с обратными таблицами внешнего ключа при печати запроса. Это потому, что prefetch извлекает их в отдельный запрос?
print product_types.query
2).all() в обходах, попадать в базу данных? или django извлекает данные из одной предварительной выборки?
pt.bevtank_set.all()
3) В общем, какие-нибудь советы о том, как я могу понять, что я действительно запрашиваю? Я не хочу делать что-то, что соответствует моим потребностям, но делать что-то, что является правильным способом удовлетворения моих потребностей.
Большое спасибо за ваше время!
1 ответ
Да, prefetch_related
извлекает связанные таблицы в отдельном запросе, поэтому вы не видите внутренних объединений.
Если вы предварительно выбрали bevtank_set
, затем pt.bevtank_set.all()
не вызовет никаких дополнительных запросов. тем не мение pt.bevtank_set.filter()
вызовет дополнительные запросы. Вы можете использовать Prefetch
объект в Django 1.7+, чтобы предварительно выбрать фильтр из предварительно выбранного набора запросов.
Что касается общих советов, Django Debug Toolbar может быть полезен для просмотра запросов SQL. Если есть дублированные запросы, это часто указывает на то, что вы можете добавить select_related
или же prefetch_related
улучшить производительность.