On 11 Sty, 10:36, Piotr Husiatyński <
PHusiatyn...@gmail.com> wrote:
[...]
> i w dużym skrócie chcę dostać listę obiektów Thread, do których nie ma
> odwołań w tabeli VisitedThread. Da się coś takiego w Djangowym ORM
> osiągnąć?
Na co najmniej dwa sposoby, przy czym ten pierwszy jest lepszy i
prostszy, natomiast drugi przytoczę jako ciekawostkę:
In [2]: print Thread.objects.filter(visitedthread__isnull=True).query
SELECT `thread`.`id`, `thread`.`author_id`,
`thread`.`latest_post_date`, `thread`.`latest_post_author_id` FROM
`thread` LEFT OUTER JOIN `visitedthread` ON (`thread`.`id` =
`visitedthread`.`thread_id`) WHERE `visitedthread`.`id` IS NULL
W tym przypadku `isnull` wymusza połączenie LEFT OUTER JOIN, a warunek
sprawdza, dla których obiektów Thread nie istnieją odpowiadające im
obiekty VisitedThread. Dokładnie to, o co Ci chodziło.
In [3]: print Thread.objects.exclude
(id__in=VisitedThread.objects.values_list(
....: 'thread', flat=True).query).query
SELECT `thread`.`id`, `thread`.`author_id`,
`thread`.`latest_post_date`, `thread`.`latest_post_author_id` FROM
`thread` WHERE NOT (`thread`.`id` IN (SELECT
`visitedthread`.`thread_id` FROM `visitedthread`))
Do filtra `in` można też przekazać podzapytanie [1] (przydatne przy
niektórych łamańcach z Django ORM).
[1]
http://docs.djangoproject.com/en/dev/ref/models/querysets/#in
P.S. Odkąd przyjrzałem się bliżej SQLAlchemy, Django ORM wydaje mi się
"gotowe w 60%". Tzn. jest fajne do pisania blogów, dpaste itp., gdzie
wystarczy prosty zrzut danych z bazy na stronę, ale już wykonanie
OUTER JOIN'a i innych konstrukcji graniczy z cudem...
fw
--
http://www.linkedin.com/in/filipwasilewski