Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 12, 2009 14:45:20

Nick2009
От:
Зарегистрирован: 2009-06-24
Сообщения: 161
Репутация: +  0  -
Профиль   Отправить e-mail  

Поподробнее про select_related

Нужно сделать join по нескольким таблицам.
Есть такая функция select_related, но
1. нигде не нашел в какой конкретно SQL это преобразуется.
2. нужно выбирать не из всех related таблиц а только из нужных, т.к. их много
3. нужно выбрать поля которые будут возвращены select, т.к. целиком тащить записи накладно.
4. как Django поймет пункт 3, ведь неполный набор полей противоречит модели?
5. связанные таблицы нужно кэшировать и можно накапливать записи между запросами.

Может быть кто-нибудь из знатоков раскроет эту тему? Желательно с примерами.
Или где об этом можно почитать подробно, для чайников? На официальном сайте недостаточно информации.



Офлайн

#2 Окт. 12, 2009 18:13:26

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

Поподробнее про select_related

А зачем вам это нужно? неужели возникают какие то проблемы со скоростью?)
я думаю в 99% процентах сильно напряжные вещи можно решить 2-мя путями:

1) засчет денормализации.
2) просто выбрать группами нужные данные и потом в скрипте все слепить.

и то почти всегда первого хватает за глаза.

ps. лучше сделать немного тормозной код но который лучше читать. А про join вообще лучше забыть. т.к если проект нагрузный то данные могут быть в таблицах которые не в одной базе и join вообще не подойдет.



Отредактировано (Окт. 12, 2009 18:20:56)

Офлайн

#3 Окт. 13, 2009 19:26:18

Nick2009
От:
Зарегистрирован: 2009-06-24
Сообщения: 161
Репутация: +  0  -
Профиль   Отправить e-mail  

Поподробнее про select_related

lorien
from django.db import connection print connection.queries
Спасибо! Теперь смотрю и ужасаюсь …



Офлайн

#4 Окт. 13, 2009 19:52:12

Nick2009
От:
Зарегистрирован: 2009-06-24
Сообщения: 161
Репутация: +  0  -
Профиль   Отправить e-mail  

Поподробнее про select_related

lorien
> 3. нужно выбрать поля которые будут возвращены select, т.к. целиком тащить записи накладно.
Почитайте про функции values, values_list в том же документе, что я выше показал.

> 4. как Django поймет пункт 3, ведь неполный набор полей противоречит модели?
А там не объекты моделей возвращаются, а просто списки значений. Если нужно именно объекты моделей, читайте про defer (http://docs.djangoproject.com/en/dev/re … fer-fields). Кажется, то что вы хотите. Сам не юзал никогда.
Списков значений достаточно.
Нашел. Когда читал, не заметил. Спасибо!



Офлайн

#5 Окт. 13, 2009 19:53:32

Nick2009
От:
Зарегистрирован: 2009-06-24
Сообщения: 161
Репутация: +  0  -
Профиль   Отправить e-mail  

Поподробнее про select_related

lorien
5. связанные таблицы нужно кэшировать и можно накапливать записи между запросами.
Не уверен, что Django умеет такое. В конце концов, если всё так плохо, то кэшируйте данные ручками в рамках одного запроса (request).
Memcached + Python модуль это умеют. Поставил, использую, вроде работает, ошибок не выдает.
В рамках одного запроса тоже нужно, сейчас с этим сражаюсь. Вопрос в другом топике.



Отредактировано (Окт. 13, 2009 19:57:00)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version