SQLAlchemy equivalente al filtro que abarca la relación de Django ORM

Este ejemplo es de la documentación de Django .

Dado el modelo de base de datos (Django):

class Blog(models.Model): name = models.CharField(max_length=100) class Entry(models.Model): blog = models.ForeignKey(Blog) headline = models.CharField(max_length=255) body_text = models.TextField() 

En Django puedo usar:

 Entry.objects.filter(blog__name__exact='Beatles Blog') 

para obtener todos los objetos de Entry para blogs con el nombre especificado.

Pregunta : ¿Cuál es la statement SQLAlchemy equivalente, dada la definición de modelo a continuación?

 class Blog(Base): __tablename__ = "blog" id = Column(Integer, primary_key=True) name = Column(Unicode(100)) class Entry(Base): __tablename__ = "entry" id = Column(Integer, primary_key=True) blogid = Column(Integer, ForeignKey(Blog.id)) headline = Column(Unicode(255)) body_text = Column(UnicodeText) blog = relationship(Blog, backref="entries") 

EDITAR

Creo que hay dos maneras de lograr esto:

 >>> q = session.query >>> print q(Entry).join(Blog).filter(Blog.name == u"One blog") SELECT entry.id AS entry_id, entry.blogid AS entry_blogid, entry.headline AS entry_headline, entry.body_text AS entry_body_text FROM entry JOIN blog ON blog.id = entry.blogid WHERE blog.name = ? >>> print q(Entry).filter(Entry.blog.has(Blog.name == u"One blog")) SELECT entry.id AS entry_id, entry.blogid AS entry_blogid, entry.headline AS entry_headline, entry.body_text AS entry_body_text FROM entry WHERE EXISTS (SELECT 1 FROM blog WHERE blog.id = entry.blogid AND blog.name = ?) # ... and of course >>> blog = q(Blog).filter(Blog.name == u"One blog") >>> q(Entry).filter(Entry.blog == blog) 

Algunas preguntas más:

  1. ¿Hay otras formas de lograr esto usando SQLAlchemy que las anteriores?
  2. ¿No tendría sentido si pudiera hacer session.query(Entry).filter(Entry.blog.name == u"One blog") en relaciones de varios a uno?
  3. ¿Qué SQL produce el ORM de Django en este caso?

Qué tal si:

 session.query(model.Entry).join((model.Blog, model.Entry.blogid==model.Blog.id)).filter(model.Blog.name=='Beatles Blog').all() 

Ya tarde para la fiesta, pero me topé con esto:
https://github.com/mitsuhiko/sqlalchemy-django-query/blob/master/sqlalchemy_django_query.py

Esto intenta generar consultas utilizando la notación django.

De los documentos: Post.query.filter_by(pub_date__year=2008)

También siempre soñé con tener “uniones mágicas” similares a Django. Estoy familiarizado con sqlalchemy-django-query it, encontré que no es lo suficientemente potente para mis tareas.

Es por eso que creé https://github.com/absent1706/sqlalchemy-mixins#django-like-queries .

Funciona de forma similar a sqlalchemy-django-query pero tiene más funciones adicionales ( aquí hay una comparación ). También está bien probado y documentado.