【问题标题】:Flask-SQLAlchemy: multiple filters through one relationFlask-SQLAlchemy:通过一个关系进行多个过滤器
【发布时间】:2015-07-09 00:12:23
【问题描述】:

我有两个模型,标签和照片,它们具有像这样的多对多关系:

tag_identifier = db.Table('tag_identifier',
                          db.Column('photo_id', db.Integer, db.ForeignKey('photo.id')),
                          db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
                         )

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

class Photo(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  tags = db.relationship('Tag', secondary=tag_identifier,
                         backref=db.backref('photos', lazy='dynamic'), lazy='dynamic')

我正在尝试查询具有多个特定标签的所有照片。例如,如果我要使用<Tag 1> <Tag 2>查询所有照片:


Photo.query.join(Photo.tags).filter(Tag.id==1).all() 会返回

[<Photo 1>, <Photo 2>, <Photo 3>, <Photo 4>],和

Photo.query.join(Photo.tags).filter(Tag.id==2).all() 会返回

[<Photo 1>, <Photo 2>, <Photo 5>, <Photo 6>].


在此示例中,我需要执行哪些操作才能获得以下结果: [<Photo 1>, <Photo 2>]

【问题讨论】:

  • 你试过了吗,Photo.query.join(Photo.tags).filter(Tag.id==1).filter(Tag.id==2).all()
  • @jonnybazookatone 是的,它返回一个空列表。使用and_ 也是如此。
  • 当然,我的错误 ;-),因为你已经有 Tag.id==1。

标签: python flask sqlalchemy flask-sqlalchemy


【解决方案1】:
q = (Photo.query
     .filter(Photo.tags.any(Tag.id == 1))
     .filter(Photo.tags.any(Tag.id == 2))
     )

请注意,您还可以检查名称:

tag1, tag2 = 'tag1', 'tag2'
q = (Photo.query
     .filter(Photo.tags.any(Tag.name == tag1))
     .filter(Photo.tags.any(Tag.name == tag2))
     )

【讨论】:

    猜你喜欢
    • 2021-04-04
    • 1970-01-01
    • 2021-05-26
    • 2021-08-14
    • 2018-02-18
    • 1970-01-01
    • 2016-08-23
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多