0

私はdjangoのORMを使用してきましたが、sqlalchemyでatm
を打ち負かしました。

recipie_voters = db.Table('recipie_voters',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('recipie_id', db.Integer, db.ForeignKey('recipie.id'))
)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    ...

class Recipie(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    ...
    voters = db.relationship('User', secondary=recipie_voters, backref=db.backref('votes', lazy='dynamic'))
    ...

問題は、Recipie で有権者 (ユーザー) の数を選択するにはどうすればよいですか?
ここから始めます。

Recipie.query.all()
4

1 に答える 1

3

これを django コンテキストに入れる方法がわかりませんが、ハイブリッド属性の宣言と使用により、コードは次のようになります。

class Recipie(Base):
    __tablename__ = 'recipie'
    id = Column(Integer, primary_key=True)
    name = Column(String(255))

    voters = relationship("User", 
             secondary=recipie_voters,
             backref=backref("votes", lazy="dynamic",),
             )


    @hybrid_property
    def voters_count(self):
        return len(self.voters)

    @voters_count.expression
    def voters_count(cls):
        return (select([func.count(recipie_voters.c.user_id)]).
                where(recipie_voters.c.recipie_id == cls.id).
                label("voters_count")
                )


# get only those Recipies with over 100 votes    
qry = session.query(Recipie).filter(Recipie.voters_count >= 100)
于 2012-11-14T14:17:06.053 に答える