Nick2009
Окт. 12, 2009 14:45:20
Нужно сделать join по нескольким таблицам.
Есть такая функция select_related, но
1. нигде не нашел в какой конкретно SQL это преобразуется.
2. нужно выбирать не из всех related таблиц а только из нужных, т.к. их много
3. нужно выбрать поля которые будут возвращены select, т.к. целиком тащить записи накладно.
4. как Django поймет пункт 3, ведь неполный набор полей противоречит модели?
5. связанные таблицы нужно кэшировать и можно накапливать записи между запросами.
Может быть кто-нибудь из знатоков раскроет эту тему? Желательно с примерами.
Или где об этом можно почитать подробно, для чайников? На официальном сайте недостаточно информации.
Evg
Окт. 12, 2009 18:13:26
А зачем вам это нужно? неужели возникают какие то проблемы со скоростью?)
я думаю в 99% процентах сильно напряжные вещи можно решить 2-мя путями:
1) засчет денормализации.
2) просто выбрать группами нужные данные и потом в скрипте все слепить.
и то почти всегда первого хватает за глаза.
ps. лучше сделать немного тормозной код но который лучше читать. А про join вообще лучше забыть. т.к если проект нагрузный то данные могут быть в таблицах которые не в одной базе и join вообще не подойдет.
Nick2009
Окт. 13, 2009 19:26:18
lorien
from django.db import connection print connection.queries
Спасибо! Теперь смотрю и ужасаюсь …
Nick2009
Окт. 13, 2009 19:52:12
lorien
> 3. нужно выбрать поля которые будут возвращены select, т.к. целиком тащить записи накладно.
Почитайте про функции values, values_list в том же документе, что я выше показал.
> 4. как Django поймет пункт 3, ведь неполный набор полей противоречит модели?
А там не объекты моделей возвращаются, а просто списки значений. Если нужно именно объекты моделей, читайте про defer (http://docs.djangoproject.com/en/dev/re … fer-fields). Кажется, то что вы хотите. Сам не юзал никогда.
Списков значений достаточно.
Нашел. Когда читал, не заметил. Спасибо!
Nick2009
Окт. 13, 2009 19:53:32
lorien
5. связанные таблицы нужно кэшировать и можно накапливать записи между запросами.
Не уверен, что Django умеет такое. В конце концов, если всё так плохо, то кэшируйте данные ручками в рамках одного запроса (request).
Memcached + Python модуль это умеют. Поставил, использую, вроде работает, ошибок не выдает.
В рамках одного запроса тоже нужно, сейчас с этим сражаюсь. Вопрос в другом топике.