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

时间:2014-10-09 05:26:19

标签: 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.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控制器/视图中,我获得了一些输入标签,例如['summer', 'selfie', ...]

问题:

  1. 对包含所有请求标签的照片进行高效查询?
  2. 如何使用不完整的代码(例如['summ', 'elfi', ...]
  3. )对搜索进行扩展

1 个答案:

答案 0 :(得分:5)

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

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)))