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