Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 2nd, 2012  |  syntax: None  |  size: 1.52 KB  |  hits: 16  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. SQLAlchemy equivalent of Django ORM's relationship-spanning filter
  2. class Blog(models.Model):
  3.     name = models.CharField(max_length=100)
  4.  
  5. class Entry(models.Model):
  6.     blog = models.ForeignKey(Blog)
  7.     headline = models.CharField(max_length=255)
  8.     body_text = models.TextField()
  9.        
  10. Entry.objects.filter(blog__name__exact='Beatles Blog')
  11.        
  12. class Blog(Base):
  13.     __tablename__ = "blog"
  14.     id = Column(Integer, primary_key=True)
  15.     name = Column(Unicode(100))
  16.  
  17. class Entry(Base):
  18.     __tablename__ = "entry"
  19.     id = Column(Integer, primary_key=True)
  20.     blogid = Column(Integer, ForeignKey(Blog.id))
  21.     headline = Column(Unicode(255))
  22.     body_text = Column(UnicodeText)
  23.  
  24.     blog = relationship(Blog, backref="entries")
  25.        
  26. >>> q = session.query
  27. >>> print q(Entry).join(Blog).filter(Blog.name == u"One blog")
  28. SELECT entry.id AS entry_id, entry.blogid AS entry_blogid, entry.headline AS entry_headline, entry.body_text AS entry_body_text
  29. FROM entry JOIN blog ON blog.id = entry.blogid
  30. WHERE blog.name = ?
  31.  
  32. >>> print q(Entry).filter(Entry.blog.has(Blog.name == u"One blog"))
  33. SELECT entry.id AS entry_id, entry.blogid AS entry_blogid, entry.headline AS entry_headline, entry.body_text AS entry_body_text
  34. FROM entry
  35. WHERE EXISTS (SELECT 1
  36. FROM blog
  37. WHERE blog.id = entry.blogid AND blog.name = ?)
  38.  
  39. # ... and of course
  40. >>> blog = q(Blog).filter(Blog.name == u"One blog")
  41. >>> q(Entry).filter(Entry.blog == blog)
  42.        
  43. session.query(model.Entry).join((model.Blog, model.Entry.blogid==model.Blog.id)).filter(model.Blog.name=='Beatles Blog').all()