Usar funciones de ventana para LIMITAR una consulta con SqlAlchemy en Postgres

Estoy intentando escribir la siguiente consulta de sql con sqlalchemy ORM:

SELECT * FROM (SELECT *, row_number() OVER(w) FROM (select distinct on (grandma_id, author_id) * from contents) as c WINDOW w AS (PARTITION BY grandma_id ORDER BY RANDOM())) AS v1 WHERE row_number <= 4; 

Esto es lo que he hecho hasta ahora:

 s = Session() unique_users_contents = (s.query(Content).distinct(Content.grandma_id, Content.author_id) .subquery()) windowed_contents = (s.query(Content, func.row_number() .over(partition_by=Content.grandma_id, order_by=func.random())) .select_from(unique_users_contents)).subquery() contents = (s.query(Content).select_from(windowed_contents) .filter(row_number >= 4)) ## how can I reference the row_number() value? result = contents for content in result: print "%s\t%s\t%s" % (content.id, content.grandma_id, content.author_id) 

Como puede ver, está bastante modelado, pero no tengo idea de cómo hacer referencia al resultado row_number() de la subconsulta de la consulta externa donde. Probé algo como windowed_contents.c.row_number y añadí una llamada a label() en la función de ventana, pero no funciona, no pude encontrar ningún ejemplo similar en los documentos oficiales o en stackoverflow.

¿Cómo se puede lograr esto? Y también, ¿podría sugerir una mejor manera de hacer esta consulta?

windowed_contents.c.row_number contra una label() es cómo lo haría, funciona para mí (tenga en cuenta que el método select_entity_from() es nuevo en SQLA 0.8.2 y será necesario aquí en 0.9 frente a select_from() ):

 from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Content(Base): __tablename__ = 'contents' grandma_id = Column(Integer, primary_key=True) author_id = Column(Integer, primary_key=True) s = Session() unique_users_contents = s.query(Content).distinct( Content.grandma_id, Content.author_id).\ subquery('c') q = s.query( Content, func.row_number().over( partition_by=Content.grandma_id, order_by=func.random()).label("row_number") ).select_entity_from(unique_users_contents).subquery() q = s.query(Content).select_entity_from(q).filter(qcrow_number <= 4) print q