首页 > Flask-Sqlalchemy many-to-many 关系查询问题

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

数据库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的。

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


目前自己是这样dirty hack的

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

【热门文章】
【热门文章】