Построение некоторых типов запросов в Django ORM

5 views
Skip to first unread message

Алексей Гусев

unread,
Jun 30, 2008, 2:50:21 AM6/30/08
to Django russian
Здравствуйте!

Много пишу на Django, но никак не могу найти решение такой проблемы.
Покажу ее на примере.

Существуют следующие модели: Магазин, Товар, ПродаваемыйТовар. Объекты
модели ПродаваемыйТовар содержат, кроме прочего, ссылки на объект
Магазин и на объект Товар.

Задача такова. Имея объект Т1 модели Товар получить объекты модели
Магазин, для которых существуют объекты модели ПродаваемыйТовар,
которые ссылаются на Т1 и на искомые объекты модели Магазин.

Как я обычно решаю эту задачу (дано Т1):

продаваемые_товары = ПродаваемыйТовар.objects.filter(товар=Т1)
магазины = [x.магазин for x in продаваемые_товары]

Решение это хоть и работает, но мне кажется, что это неэффективно. В
первой строке ORM формирует ленивый запрос, который выполняется во
второй строке при обращении (так я понимаю ленивые запросы), затем
инициализируются объекты модели ПродаваемыйТовар, а затем в цикле по
результатам запроса инициализируются объекты модели Магазин.

Но если абстрагироваться от ORM, то легко написать SQL-запрос, который
позволит не инициализировать объекты ПродаваемыйТовар, а просто
приджойнить их. Хотелось бы узнать -- существует ли способ сделать это,
не оперируя с SQL.

P.S. Нет, я не пишу еще один электронный магазин. Такая схема дана для
наглядности.

Спасибо.

Serge Matveenko

unread,
Jun 30, 2008, 2:53:05 AM6/30/08
to django-...@googlegroups.com
2008/6/30 Алексей Гусев <alx...@gmail.com>:

> Много пишу на Django, но никак не могу найти решение такой проблемы.

больше читайте... о Django, про Django, маны Django.


--
Serge Matveenko
mailto:se...@matveenko.ru
http://serge.matveenko.ru/
CTO at Web-Mark
mailto:se...@web-mark.ru
http://www.web-mark.ru/

Алексей Гусев

unread,
Jun 30, 2008, 2:58:34 AM6/30/08
to Django russian
Спасибо, вы очень любезны. Надеюсь, ваше сообщение будет единственным
RTFM-сообщением в этой теме.

On 30 июн, 11:53, "Serge Matveenko" <se...@matveenko.ru> wrote:
> 2008/6/30 Алексей Гусев <alx....@gmail.com>:
>
> > Много пишу на Django, но никак не могу найти решение такой проблемы.
>
> больше читайте... о Django, про Django, маны Django.
>
> --
> Serge Matveenko
> mailto:se...@matveenko.ruhttp://serge.matveenko.ru/

Yuri Baburov

unread,
Jun 30, 2008, 3:00:14 AM6/30/08
to django-...@googlegroups.com
привет,

магазины = Магазины.objects.filter(продаваемыетовары__товар=T1) ?

2008/6/30 Алексей Гусев <alx...@gmail.com>:

--
Best regards, Yuri V. Baburov, ICQ# 99934676, Skype: yuri.baburov,
MSN: bu...@live.com

wiz

unread,
Jun 30, 2008, 3:00:33 AM6/30/08
to django-...@googlegroups.com
Нет, последним будет этот.

RTFM !!!

http://www.djangoproject.com/documentation/db-api/#lookups-that-span-relationships

2008/6/30 Алексей Гусев <alx...@gmail.com>:

--
GNU/Hippie
... ~]# make love

Алексей Гусев

unread,
Jun 30, 2008, 3:05:08 AM6/30/08
to Django russian
Спасибо, Юрий :-)

После вашего ответа, в отличие от RTFM, стало стыдно :-)

On 30 июн, 12:00, "Yuri Baburov" <burc...@gmail.com> wrote:
> привет,
>
> магазины = Магазины.objects.filter(продаваемыетовары__товар=T1) ?
>
> 2008/6/30 Алексей Гусев <alx....@gmail.com>:

wiz

unread,
Jun 30, 2008, 3:09:29 AM6/30/08
to django-...@googlegroups.com
А нам то как стыдно тут такие вопросы читать, вы даже не представляете наверно.

2008/6/30 Алексей Гусев <alx...@gmail.com>:

--

Serge Matveenko

unread,
Jun 30, 2008, 3:15:39 AM6/30/08
to django-...@googlegroups.com
2008/6/30 wiz <aenor...@gmail.com>:

> А нам то как стыдно тут такие вопросы читать, вы даже не представляете наверно.

вот это точно

есть три мана, которые надо знать наизусть (или, как минимум, знать
наизусть что в них есть):
http://www.djangoproject.com/documentation/model-api/
http://www.djangoproject.com/documentation/db-api/
http://www.djangoproject.com/documentation/templates/
4. http://www.djangoproject.com/documentation/templates_python/
(stronglly recomended)

есть эта рассылка, которую надо читать внимательно и разбирать ответы
на вопросы - это лучшие примеры в экспу

а про сабж я спрашивал в этой рассылке пару месяцев назад. тогда мне
очень хорошо и кратко ответили;)
недавно пересылал коллеге письмо с ответом на мой тогдашний вопрос,
чтоб он не задавал сюда нового...


--
Serge Matveenko
mailto:se...@matveenko.ru

Reply all
Reply to author
Forward
0 new messages