Flask-Sqlalchemy many-to-many 关系查询问题

发布于 2022-09-01 19:54:37 字数 1856 浏览 9 评论 0

数据库ORM定义如下


TagsMap = db.Table('tagsmap',

db.Column('tag_id', db.Integer, db.ForeignKey('tags.id')),
db.Column('material_id', db.Integer, db.ForeignKey('materials.id'))
)

class Materials(db.Model):

__tablename__ = 'materials'
id = db.Column(db.Integer,primary_key=True)
createtime = db.Column(db.DateTime())
filename = db.Column(db.Text(30))
category = db.Column(db.String(10))
dir = db.Column(db.String(20))
tags = db.relationship('Tags',secondary=TagsMap,
                       backref = db.backref('materials', lazy='dynamic'),lazy="dynamic")

def __init__(self,createtime,filename,category,dir):
    self.createtime = createtime
    self.filename   = filename
    self.category   = category
    self.dir        = dir

def __repr__(self):
    return 'filename %s of category %s ' % (self.filename, self.category)

class Tags(db.Model):

__tablename__ = 'tags'
id = db.Column(db.Integer,primary_key=True)
tagparent = db.Column(db.String(20))
tagname = db.Column(db.String(20))
#material = db.relationship('Materials',secondary=TagsMap,
#                            backref = db.backref('tags',lazy="dynamic"),lazy="dynamic")

def __init__(self,tagparent,tagname):
    self.tagparent = tagparent
    self.tagname   = tagname

def __repr__(self):
    return '%s ' % (self.tagname,)

问题说明:
其实数据模型就是最常见的POSTS对TAGS模型了,只是这里POSTS变成了Materials。

需要帮助的地方是,比如说我一个Materials(假如说'菜篮子1')里头可能有三个Tags,分别为‘西红柿’,‘香蕉’,‘苹果’。

现在我从前端页面获取到了‘西红柿’和'香蕉'这两个post参数,在后台进行数据库查询时怎么进行操作才能获取到‘菜篮子1’这个materials。

而现在我的查询代码如下

    results = Materials.query.filter(Materials.tags.any(Tags.tagname.in_([valuelist[0],valuelist[1]]))).all()

in_这个过滤器只能属于查询是否在两个选项之中,我需要的是某个tags属性包含了这两个选项的materials的。

不知道问题是否描述清楚,提前感谢你的帮助~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

画骨成沙 2022-09-08 19:54:37

目前自己是这样dirty hack的

先查出tags包含‘西红柿’的materials,然后查出tags包含‘香蕉’的materials,然后对这两个materials做并集。。就获取出tags里同事包含‘西红柿’和‘香蕉’的materials了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文