Уведомления

Jabber-конференция сообщества: pythonua@conference.jabber.ru
  • Начало
  • » Django
  • » Подходит ли джанговский orm для создания сложных запросов [RSS Feed]

#1 Май 18, 2007 20:04:03

cyberface
От:
Зарегистрирован: 2007-05-18
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Подходит ли джанговский orm для создания сложных запросов

Всем привет, уже неделю присматриваюсь к Питону и джанго, так как писать на php больше нету сил.
Все отлично, кроме одного - ORM, вернее то, что я пока не понимаю как с помощью него строить сложные запросы. Вроде бы читал я всякие туториалы, документацию смотрел, но все равно что-то не понятно, быть просто потому что у меня мозги не работают обьектно?
Вот, например, от прошлой пхпшной наработки остался такой запрос:

SELECT forums.id, forums.title, forums.name,
COUNT(DISTINCT posts.id) AS posts,
COUNT(DISTINCT topics.id)AS topics

FROM forums

LEFT JOIN topics
ON topics.forum_id = forums.id
AND topics.hide=0

LEFT JOIN posts
ON posts.topic_id = topics.id
AND posts.hide=0

WHERE forums.pinned = '$pinned'
GROUP BY forums.id
ORDER BY posted DESC LIMIT 50
Как представить такой запрос в джанго? Ума не приложу :-\
Может поможите?



Офлайн

#2 Май 19, 2007 13:12:38

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Подходит ли джанговский orm для создания сложных запросов

group by нет в django orm



Офлайн

#3 Май 21, 2007 08:45:03

mx
От:
Зарегистрирован: 2007-05-21
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Подходит ли джанговский orm для создания сложных запросов

Я делаю так :

class ExampleManager(models.Manager):
def groupby(self, oob_in):
from django.db import connection
cursor = connection.cursor()
cursor.execute('SELECT * FROM name_tables GROUP BY %s', )
group_idents = [item for item in cursor.fetchall()]
return self.filter(id__in = group_idents)

Вообще то обещают добавить …



Офлайн

#4 Май 21, 2007 12:26:19

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Подходит ли джанговский orm для создания сложных запросов

'SELECT * FROM name_tables GROUP BY %s'
Насколько понимаю, в этом запросе не хватает агрегат-функции.



Офлайн

#5 Май 22, 2007 15:08:41

cyberface
От:
Зарегистрирован: 2007-05-18
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Подходит ли джанговский orm для создания сложных запросов

Проблема не GROUP BY, проблема в другом - как приджоинить к одноймодели другую?



Офлайн

#6 Май 22, 2007 17:47:21

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Подходит ли джанговский orm для создания сложных запросов

Переформулируй задачу словами, лениво запрос разбирать.



Офлайн

#7 Май 22, 2007 20:22:20

cyberface
От:
Зарегистрирован: 2007-05-18
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Подходит ли джанговский orm для создания сложных запросов

Возьмем простенький код:

class Forum(models.Model):
name = models.CharField(maxlength=255)
created = models.DateTimeField(auto_now_add=True)

class Topic(models.Model):
forum = models.ForeignKey(Forum)
subject = models.CharField(maxlength=255)
created = models.DateTimeField(auto_now_add=True)

class Post(models.Model):
topic = models.ForeignKey(Topic)
body = models.TextField()
posted= models.DateTimeField(auto_now_add=True)

Упростил все как мог.
Задача такая вывести список форумов с количеством тем и сообщений напротив каждого форума.
Запрос тут простой - берем таблицу форумов, присоеденяем таблицу с топиками, постами, сортируем.
Как мне быть с джанго? Как имея эти модели вывести список форумов, да притом в один запрос!

Я конечно понимаю, что можно хранить количество тем и сообщеий прямо в таблице с форумами, но ради примера сойдет.



Отредактировано (Май 22, 2007 20:22:52)

Офлайн

#8 Май 22, 2007 22:42:12

Maximbo
От:
Зарегистрирован: 2006-11-04
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

Подходит ли джанговский orm для создания сложных запросов

Про select_related() читали? Может помочь в данном случае. Иван Сагалаев очень хорошо описал как и зачем этим пользоваться.

IMO, auto_now_add лучше заменить на default=datetime.now. Похоже, разработчики Django хотят выбросить этот параметр из будущих версий.



Офлайн

#9 Май 23, 2007 07:03:20

cyberface
От:
Зарегистрирован: 2007-05-18
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Подходит ли джанговский orm для создания сложных запросов

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



Офлайн

#10 Май 23, 2007 08:21:32

mx
От:
Зарегистрирован: 2007-05-21
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Подходит ли джанговский orm для создания сложных запросов

Я что то не совсем понял…

Мой пример разве не подходит ?

class ExampleManager(models.Manager):
def example(self ):
from django.db import connection
cursor = connection.cursor()
cursor.execute('ТУТ ЛЕПИШЬ ЛЮБОЙ СКУЛЬ ЗАПРОС ЧТО ТЕБЕ НАДО')
items_idents = [item for item in cursor.fetchall()]
return self.filter(id__in = items_idents)

Лепишь любой запрос ( плохо что может при сменене БД может не сработать - но это зависит от … )
он выдает таблицу на выходе ….

Или я не врубаюсь что надо то ?



Офлайн

  • Начало
  • » Django
  • » Подходит ли джанговский orm для создания сложных запросов[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version