2013-12-05 4 views
0

в SQLAlchemy, модели, как это:сделать запрос ManyToMany в sqlalchemy?

class User(Base): 
    id = Column(IdDataType, primary_key=True) 
    name = Column(Unicode(50)) 
class Group(Base): 
    id = Column(IdDataType, primary_key=True) 
    name = Column(Unicode(50)) 
    members = relationship('User', secondary='group_members', backref='memeber_groups') 

group_members = Table('group_members', Base.metadata, 
    Column('group_id', IdDataType, ForeignKey('group.id')), 
    Column('user_id', IdDataType, ForeignKey('user.id')), 
    Column('join_time', DateTime, default=datetime.now) 
) 

User и Group является manytomany relaionship, теперь я хочу найти count(users) где group.id=3 и join_time является between now and preivew week, как сделать этот SQL в SQLAlchemy

ответ

0

Это это скорее объект ассоциации, чем прямой много-ко-многим, поэтому я бы установил его следующим образом:

class User(Base): 
    id = Column(Integer, primary_key=True) 
    name = Column(Unicode(50), nullable=False, unique=True) 


class Group(Base): 
    id = Column(Integer, primary_key=True) 
    name = Column(Unicode(50), nullable=False, unique=True) 


class Membership(Base): 
    user_id = Column(Integer, ForeignKey(User.id), primary_key=True) 
    group_id = Column(Integer, ForeignKey(Group.id), primary_key=True) 
    joined_on = Column(DateTime, nullable=False, default=datetime.utcnow, server_default=func.current_timestamp()) 

    user = relationship(User, backref=backref('memberships', collection_class=set)) 
    group = relationship(Group, backref=backref('memberships', collection_class=set)) 


User.groups = association_proxy('memberships', 'group') 
Group.users = association_proxy('memberships', 'user') 

Запрос будет выглядеть так:

session.query(Membership.user_id).filter(Membership.group_id == 3, Membership.joined_on.between(previous, now)).count() 
Смежные вопросы