2014-10-09 3 views
2

내가 정의한 모델 여러 requred 태그와 태그 : 내가 예를 ['summer', 'selfie', ...]의 입력 태그의 배열을 얻을플라스크-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')) 

플라스크에 컨트롤러 /보기.

질문 : 요청 된 모든 태그를 포함하는 사진을

  1. 효율적인 쿼리?
  2. ['summ', 'elfi', ...]과 같이 불완전한 태그가있는 검색은 어떻게 확장 할 수 있습니까?

답변

5

되지 않을 수 있습니다 가장 효율적인 (당신이 검색 할 수있는 많은 태그가있는 경우),하지만 쿼리를 작성하는 데 매우 읽을 수 방법 : 불완전 사용 startswith(..) 대신 ==를 들어

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

를 :

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

귀하의 솔루션은 훌륭합니다. 방금'startswith()'를'contains()'로 대체했습니다. 큰 고마워. – gcerar