なぜかFlaskではなくSQLAlchemyではまる
よくあるタグとエントリーの多対多のテーブル。
entry_tags = Table('entry_tags', Base.metadata,
Column('entry_id', Integer, ForeignKey('entries.id')),
Column('tag_id', Integer, ForeignKey('tags.id'))
)
class Tag(Base):
__tablename__ = 'tags'
id = Column(Integer, primary_key=True)
name = Column(String(128), unique=True)
entries = relation("Entry", secondary=entry_tags)
class Entry(Base):
__tablename__ = 'entries'
id = Column(Integer, primary_key=True)
title = Column(String(128), unique=True)
content = Column(Text())
pubdate = Column(DateTime)
tags = relation("Tag", secondary=entry_tags)
このとき、タグをもつエントリを検索したい。単にエントリ最新10件をとってきたい場合には
entries = db_session.query(Entry).order_by(Entry.pubdate.desc()).limit(10)
でいい。
続いて、あるタグがふられているエントリの最新10件をとってきたい場合にどう書いていいか悩んだ挙句、結局わからなかったのでINを使うことにした。
tag_ids = [t.id for t in db_session.query(Tag).filter(Tag.name == tagname).first().entries]
entries = db_session.query(Entry).filter(Entry.id.in_(tag_ids)).order_by(Entry.pubdate.desc()).limit(10)
filterかfilter_byに何入れればいいんだろう?
2010.08.01 追記
relationでorder_byを設定すればよかった。
entries = relation("Entry", secondary=entry_tags, order_by=Entry.pubdate.desc)
でもって
entries = db_session.query(Tag).filter(Tag.name == tagname).first().entries
とすれば、あるタグを含むエントリを日付の最近の順に取ってくる。