【问题标题】:Flask-SQLAlchemy query many-to-many tagging with multiple requred tagsFlask-SQLAlchemy 使用多个 requred 标签查询多对多标签
【发布时间】:2014-12-03 22:35:36
【问题描述】:

我已经定义了模型:

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

在烧瓶控制器/视图中,我得到输入标签数组,例如 ['summer', 'selfie', ...]

问题:

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

【问题讨论】:

    标签: flask sqlalchemy many-to-many flask-sqlalchemy tagging


    【解决方案1】:

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

    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()。非常感谢。
    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    相关资源
    最近更新 更多