Найти - Пользователи
Полная версия: Подходит ли джанговский orm для создания сложных запросов
Начало » Django » Подходит ли джанговский orm для создания сложных запросов
1 2
cyberface
Всем привет, уже неделю присматриваюсь к Питону и джанго, так как писать на 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
Как представить такой запрос в джанго? Ума не приложу :-\
Может поможите?
j2a
group by нет в django orm
mx
Я делаю так :

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)

Вообще то обещают добавить …
j2a
'SELECT * FROM name_tables GROUP BY %s'
Насколько понимаю, в этом запросе не хватает агрегат-функции.
cyberface
Проблема не GROUP BY, проблема в другом - как приджоинить к одноймодели другую?
j2a
Переформулируй задачу словами, лениво запрос разбирать.
cyberface
Возьмем простенький код:

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)

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

Я конечно понимаю, что можно хранить количество тем и сообщеий прямо в таблице с форумами, но ради примера сойдет.
Maximbo
Про select_related() читали? Может помочь в данном случае. Иван Сагалаев очень хорошо описал как и зачем этим пользоваться.

IMO, auto_now_add лучше заменить на default=datetime.now. Похоже, разработчики Django хотят выбросить этот параметр из будущих версий.
cyberface
Конечно читал про select_related(), но он подтягивает табличку обычный джоином, и при этом мне нужно присоеденить данные к табличке с форумами, которая не имеет внешних ключей.
mx
Я что то не совсем понял…

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

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)

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

Или я не врубаюсь что надо то ?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB