2016-07-21 9 views
1

Lassen Sie sich sagen, ich habe diese Tabellen mit pony.orm abgebildet:pony.orm sortiert nach neuestem Entity in Beziehung

class Category(db.Entity): 
    threads = Set("Thread") 

class Thread(db.Entity): 
    category = Required("Category") 
    posts = Set("Post") 

class Post(db.Entity): 
    thread = Required("Thread") 
    timestamp = Required(datetime) 

Jetzt möchte ich alle Themen einer bestimmten Kategorie von dort neuester Post bestellt bekommen:

Mit dieser Zeile bekomme ich die ID des neuesten Posts, aber ich will das Objekt.

query = select((max(p.id), p.thread) for p in Post if p.thread.category.id == SOME_ID) 
    .order_by(lambda post_id, thread: -post_id) 

Natürlich konnte ich [(Post[i], thread) for i, thread in query] oder select(p for p in Post if p.id in [i for i,_ in query])

Aber das schafft zusätzliche SQL-Anweisungen. Also meine Frage ist: Wie kann ich die neuesten Beiträge aller Threads in einer bestimmten Kategorie nach dem Zeitstempel dieses Beitrags mit einer einzigen SQL-Anweisung erhalten.

Ich würde nicht db.execute(sql) verwenden, wenn Sie das ORM nicht verwenden können.

Antwort

1

Versuchen Sie folgendes:

select((p, t) for t in Thread for p in t.posts 
       if p.id == max(p2.id for p2 in t.posts) 
     ).order_by(lambda p, t: desc(p.id)) 
+0

Wow, das ist, warum ich pony.orm lieben: Es ist nur Python. Aber was ich nicht verstehe: Warum ist 'select (t für t in category.threads) 'ungültig ->" über Nicht-Entity-Objekt iterierend ", sondern' select (p für t in Thread für p in t.posts) ' fein? In beiden Fällen wiederhole ich eine 'Set'-Beziehung. – Wombatz

+0

'select (t für t in category.threads)' sollte auch in Ordnung sein, aber die entsprechende Übersetzungslogik ist noch nicht implementiert. Es sollte relativ einfach sein, aber andere Aufgaben waren dringender. Ich hoffe, wir können es bald umsetzen. –