Flask-SQLAlchemy使用多个requred标签查询多对多标记

gce*_*rar 2 tagging many-to-many sqlalchemy flask flask-sqlalchemy

我已经定义了模型:

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'))
Run Code Online (Sandbox Code Playgroud)

在烧瓶控制器/视图中,我获得了一些输入标签['summer', 'selfie', ...].

问题:

  1. 高效查询包含所有请求标签的照片?
  2. 如何扩展搜索不完整的标签,如['summ', 'elfi', ...]

van*_*van 5

可能不是最有效的(如果你有很多标签要搜索),但组成查询的方式非常易读:

input_tags = ['selfie', 'summer']
q = db.session.query(Photo)
for tag in input_tags:
    q = q.filter(Photo.tags.any(Tag.name == tag))
Run Code Online (Sandbox Code Playgroud)

不完整使用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)))
Run Code Online (Sandbox Code Playgroud)