Flask SQLAlchemy查询具有多个所需标记的多对多标记

Flask SQLAlchemy查询具有多个所需标记的多对多标记,flask,sqlalchemy,many-to-many,flask-sqlalchemy,tagging,Flask,Sqlalchemy,Many To Many,Flask Sqlalchemy,Tagging,我定义了以下模型: tags = db.Table('tags', db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')), db.Column('photo_id', db.Integer, db.ForeignKey('photo.id')), ) class Tag(db.Model): id = db.Column(db.I

我定义了以下模型:

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


class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32), unique=True)


class Photo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    sha1sum = db.Column(db.LargeBinary(20), unique=True)
    ...
    tags = db.relationship('Tag', secondary=tags,
                           backref=db.backref('photos', lazy='dynamic'))
在flask controller/view中,我得到了一组输入标记,例如
['summer','selfie',…]

问题:

  • 高效查询包含所有请求标记的照片
  • 如何扩展它以用于带有不完整标记的搜索,例如
    ['summ','elfi',…]
  • 可能不是最有效的方法(如果您有许多标记要搜索),但却是编写查询的非常可读的方法:

    input_tags = ['selfie', 'summer']
    q = db.session.query(Photo)
    for tag in input_tags:
        q = q.filter(Photo.tags.any(Tag.name == tag))
    
    对于不完整的使用,
    startswith(..)
    而不是
    =

    input_tags = ['sum', 'fu']
    q = db.session.query(Photo)
    for tag in input_tags:
        q = q.filter(Photo.tags.any(Tag.name.startswith(tag)))
    

    你的解决方案很好。我刚刚用
    contains()
    替换了
    startswith()
    。非常感谢。