Форум сайта python.su
Всем привет, уже неделю присматриваюсь к Питону и джанго, так как писать на 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
Офлайн
group by нет в django 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)
—
Вообще то обещают добавить …
Офлайн
'SELECT * FROM name_tables GROUP BY %s'Насколько понимаю, в этом запросе не хватает агрегат-функции.
Офлайн
Проблема не GROUP BY, проблема в другом - как приджоинить к одноймодели другую?
Офлайн
Переформулируй задачу словами, лениво запрос разбирать.
Офлайн
Возьмем простенький код:
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)
Офлайн
Про select_related() читали? Может помочь в данном случае. Иван Сагалаев очень хорошо описал как и зачем этим пользоваться.
IMO, auto_now_add лучше заменить на default=datetime.now. Похоже, разработчики Django хотят выбросить этот параметр из будущих версий.
Офлайн
Конечно читал про select_related(), но он подтягивает табличку обычный джоином, и при этом мне нужно присоеденить данные к табличке с форумами, которая не имеет внешних ключей.
Офлайн
Я что то не совсем понял…
Мой пример разве не подходит ?
—
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)
—
Лепишь любой запрос ( плохо что может при сменене БД может не сработать - но это зависит от … )
он выдает таблицу на выходе ….
Или я не врубаюсь что надо то ?
Офлайн