LINUX.ORG.RU

Django orm и объединения таблиц

 ,


0

1

Удовлетворяя любопытство к ORM системам, в частности Django, видимо столкнулся с проблемой парадигм ORM vs SQL и уже накатанная годами привычка для создания сложных объектов с использованием JOIN или VIEW, объединяющих нужные множества в нужные подмножества практически отключают интуицию при использовании ORM — стою как баран перед царскими вратами

Допустим есть множество текстов, с множеством коментов к каждому тексту, нужно вывести список (n) последних коментов сгруппированных по id текста с заголовками текстов, проще написать join объединяющий обе таблицы через foreginkey, а засунуть этот join в view и иметь как бы обычное множество

а в случае Django имееются две модели, каждая по отдельности работает просто замечательно, но вот с объединением не понятки, куда копать?

есть какой то хитрый фильтр?

нужно руками создавать VIEW и делать для него модель?

нужно делать новую модель и она создаст VIEW?

может быть есть какие то фабрики соединяющие модели?

как вообще там ведутся разработки?

★★

Ответ на: комментарий от provaton

Воистину Воскрес!

ps: как я уже понял это настоящий костыль, а может быть это у меня ошибка и в джанге это делается другим способом?

fMad ★★ ()
Последнее исправление: fMad (всего исправлений: 1)

Да, django orm такой, чуть что, сразу надо SQL руками набивать.

baverman ★★★ ()
Ответ на: комментарий от fMad

Костыль или не костыль, но джоин он делает:

Модели:

from django.db import models

class Item(models.Model):
    body = models.CharField(max_length=128)


class Comment(models.Model):
    item = models.ForeignKey(Item)
    text = models.TextField()

Запросы:

In [4]: tst.models.Comment.objects.all()
(0.000) SELECT "tst_comment"."id", "tst_comment"."item_id", "tst_comment"."text" FROM "tst_comment" LIMIT 21; args=()
Out[4]: []

In [5]: tst.models.Comment.objects.select_related().all()
(0.000) SELECT "tst_comment"."id", "tst_comment"."item_id", "tst_comment"."text", "tst_item"."id", "tst_item"."body" FROM "tst_comment" INNER JOIN "tst_item" ON ("tst_comment"."item_id" = "tst_item"."id") LIMIT 21; args=()

Потом при обращении к Comment.item.body уже больше запросов в базу делаться не будет.

Но вообще, если тебе интересен SQL со всеми тонкостями, то посмотри лучше на SQLAlchemy, там гораздо больше интересных вещей можно сделать. Джанговский ОРМ очень многое упрощает и абстрагирует. Кому-то это нравится, кому-то не очень, но факт остается фактом.

provaton ★★★★★ ()
Ответ на: комментарий от provaton

значит так и нету ни какой серебрянной пули

принципе вьюшки можно сконвертировать используя extra(...)

спасибо .. закрыто

fMad ★★ ()
Последнее исправление: fMad (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.