flask-sqlalchemy下的多对多关系的多表查询

博客与标签是多对多关系
一共三张表
标签表、博客表、以及中间表
flask-sqlalchemy多对多查询

# 标签表 #
class Tags(db.Model):
    __tablename__ = "tags"
    id = db.Column(db.Integer, primary_key=True)  # id号
    name = db.Column(db.String(128))  # 标签名字
    create_time = db.Column(db.DateTime, default=datetime.now)


# 博客标签中间表
class BlogTags(db.Model):
    __tablename__ = 'blog_tags'
    id = db.Column(db.Integer, primary_key=True)  # id号
    tag_id = db.Column(db.Integer, db.ForeignKey("tags.id"), nullable=False)  # 联系到用户
    blog_id = db.Column(db.Integer, db.ForeignKey("blog.id"), nullable=False)  # 联系到帖子
    create_time = db.Column(db.DateTime, default=datetime.now)  # 点赞时间


# 社区博客
class Blog(db.Model):
    __tablename__ = "blog"
    id = db.Column(db.Integer, primary_key=True)  # 帖子id
    tags = db.relationship("Tags", secondary="blog_tags", backref="blogs")
    title = db.Column(db.String(32), nullable=False)  # 帖子标题
    text = db.Column(db.TEXT, nullable=False)  # 帖子内容
    likes = db.Column(db.Integer, nullable=False, default=0)  # 点赞数

正常可以通过某个标签获取该标签下的所有博客

tag = Tags.query.get(1)
blogs = tag.blogs

也可以通过某个博客获取该博客下的所有标签

blog = Blog.query.get(1)
tags = blog.tags

如果我想获取某些标签下的博客并且还行对筛选出来的博客进行某种关系排序怎么做呢?
比如我想获取某些标签下的博客,并且对博客进行点赞数倒叙排序
那么可以输入下面的代码

blog_list = Blog.query.filter(Blog.tags).filter(Tags.name.in_([tags])).order_by(desc("likes"))

打印出来的sql语句是

SELECT blog.id AS blog_id, blog.title AS blog_title, blog.text AS blog_text, blog.likes AS blog_likes
FROM blog, blog_tags AS blog_tags_1, tags 
WHERE blog.id = blog_tags_1.blog_id AND tags.id = blog_tags_1.tag_id AND tags.name IN (%(name_1)s) ORDER BY blog.likes DESC

可以满足我们的要求

更新时间:2020-11-12 22:38:04

本文由 菜鸡音宫 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:https://www.hicaiji.com/archives/flask-sqlalchemy-duoduiduo-search
最后更新:2020-11-12 22:38:04

Your browser is out of date!

Update your browser to view this website correctly. Update my browser now

×