【发布时间】:2020-12-27 00:53:03
【问题描述】:
我正在使用 Flask-SQLAlchemy 开发一个 API。我有一个包含帖子、标签和它们之间的多对多映射的数据库。我想在搜索中查找至少有一个匹配标签的帖子。例如,搜索标签“A”、“B”和“C”应返回以“A”或“B”或“C”作为标签的帖子。
我大致遵循Charles Leifer's example 在使用多对多关系时查询多个标签。但是,我当前的查询根本不返回任何行:
@app.route('/api/posts/search', methods=['GET'])
def search_posts():
tags = json.loads(request.data['tags'])
posts = db.session.query(Post).join(TagMap).join(Tag).filter(Tag.tag in tags).group_by(Post.id).all()
return jsonify(posts)
我已确认标签作为字符串列表正确输入数据库,并且我已将帖子、标签以及它们之间的映射正确存储在数据库中。
如有需要,我的模型如下:
@dataclass
class Post(db.Model):
__tablename__ = 'post'
id:int
text:str
created:str
op:bool
id = db.Column(
db.Integer,
primary_key=True
)
text = db.Column(
db.String(2000),
index=False,
nullable=False
)
@dataclass
class Tag(db.Model):
__tablename__ = 'tag'
id:int
tag:str
id = db.Column(
db.Integer,
primary_key=True
)
tag = db.Column(
db.String(32),
index=False,
nullable=False,
unique=True
)
@dataclass
class TagMap(db.Model):
__tablename__ = 'tagmap'
post_id:int
tag_id:int
id = db.Column(
db.Integer,
primary_key=True
)
post_id = db.Column(
db.ForeignKey('post.id'),
index=False,
nullable=False
)
tag_id = db.Column(
db.ForeignKey('tag.id'),
index=False,
nullable=False
)
【问题讨论】:
标签: python sql flask sqlalchemy flask-sqlalchemy