2014-10-09 63 views
2

我已定義的模型:燒瓶SQLAlchemy的查詢多到許多標記與多個requred標籤

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', ...]

回答

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

您的解決方案非常棒。我剛剛用'contains()'替換'startswith()'。非常感謝。 – gcerar 2014-10-11 10:10:46