2012-07-19 8 views
10

ブログエントリとタグの間に多対多の関係があります。今、私は特定のタグが持つエントリの数を知りたいと思います。 多対多関係の行数をカウントする(SQLAlchemy)

(簡体)次のモデルを想像してみて:

rel_entries_tags = Table('rel_entries_tags', Base.metadata, 
    Column('entry_id', Integer, ForeignKey('entries.id')), 
    Column('tag_id', Integer, ForeignKey('tags.id')) 
) 

class Entry(Base): 
    __tablename__ = 'entries' 

    id = Column(Integer, primary_key=True) 
    title = Column(String(80)) 
    text = Column(Text) 

    tags = relationship('Tag', secondary=rel_entries_tags, backref=backref('entries')) 

    def __init__(self, title, text): 
    self.title = title 
    self.text = text 
    self.tags = tags  

class Tag(Base): 
    __tablename__ = 'tags' 

    id = Column(Integer, primary_key=True) 
    name = Column(String(80), unique=True, nullable=False) 

    def __init__(self, name): 
    self.name = name 

私のアプローチを、タグのエントリの量をカウントするlen(db_session.query(Tag).get(1).entries)です。問題は、db_session.query(Tag).get(1).entriesをSQLAlchemyが取得したときに、タグのすべての列を含むすべてのエントリを選択するということです。ただし、エントリ自体ではなく、エントリの量だけを必要とします。この問題の最適なアプローチはありますか?

ありがとうございました。

答えて

15
session.query(Entry).join(Entry.tags).filter(Tag.id==1).count() 

またはすでにタグ

session.query(Entry).with_parent(mytag, "entries").count() 
+4

1を持っている場合:あなたは、多くの場合、これを必要とする場合、あなたがプロパティを作成することができます: '@propertyの\ nを デフentries_cnt(自己):\ nはcount() ' – van

+0

この回答に感謝します。しかし、生成されたSQLステートメントは 'SELECT count(*)AS count_1 FROM(SELECT order_line.id AS order_line_id、order_line.order_id AS order_line_order_id FROM order_line WHERE%(param_1)s = order_line.order_id)AS an_1_1 つまり、 - 1つの 'SELECT count(*)FROM order_line WHERE order_line.order_id =%(param_1)s'の代わりに、内部SELECTを取得します。 私の場合、1対多ではありません(Orderには多くのOrderLineがあります)。 – guyarad

+0

クエリを実行します(func.count( '*'))。 [count()ドキュメント](http://docs.sqlalchemy.org/en/latest/orm/query.html?highlight=query.count#sqlalchemy.orm.query.Query.count)はこれを参照しています。 – zzzeek