Этот пример взят из документации Django .
Учитывая модель базы данных (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()
В Django я могу использовать:
Entry.objects.filter(blog__name__exact='Beatles Blog')
для получения всех Entry
объектов для блогов с указанным именем.
Вопрос : Что такое эквивалентное утверждение SQLAlchemy, учитывая приведенное ниже определение модели?
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")
EDIT
Я считаю, что есть два способа сделать это:
>>> 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)
Еще несколько вопросов:
- Есть ли другие способы сделать это с помощью SQLAlchemy, кроме указанных выше?
- Разве не имеет смысла, если бы вы могли делать
session.query(Entry).filter(Entry.blog.name == u"One blog")
в отношениях многих к одному?
- Какой SQL в этом случае генерирует ORM Джанго?