# Flask-SQLAlchemy:多对多 过滤条件

多对多关系如下:(例子)

parent_to_children = db.Table('parent_to_children',
                          db.Column('parent_id', db.Integer, db.ForeignKey('parent.id')),
                          db.Column('children_id', db.Integer, db.ForeignKey('children.id'))
                         )

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

class Parent(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  childrens = db.relationship('Children', secondary=parent_to_children,
                        backref=db.backref('parents', lazy='dynamic'), lazy='dynamic')

# 根据子条件过滤获取父数据

根据 Children 的 id 多少来返回 Parent 的数据

Parent.query.join(Parent.childrens).filter(Children.id==1).all()

当 Children 有多个条件的时候

q = (Parent.query
     .filter(Parent.childrens.any(Children.id == 1))
     .filter(Parent.childrens.any(Children.name == 'test'))
     )

# 根据父数据过滤子数据

先获取一条父数据

parent = Parent.query.first()

这时候我们可以用 parent.childrens 获取该父数据下所有的子数据,但这时候我们会需要过滤子数据我们可以,如下:

children = parent.childrens.filter(Children.id == 1)

就跟平时的条件过滤是一样的