搜索关系属性的完全匹配

Posted

技术标签:

【中文标题】搜索关系属性的完全匹配【英文标题】:Searching an exact match for the attribute of a relation 【发布时间】:2018-06-19 15:33:27 【问题描述】:

我有以下 SQLAlchemy DB 模型,这些模型描述了经过多个生产步骤的部件:

class Part(db.Model):
    part_number = db.Column(db.Integer, primary_key=True) 
    production_steps = db.relationship("ProductionStep")


class ProductionStep(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    part_number = db.Column(db.Integer, db.ForeignKey('part.part_number'))
    name = db.Column(db.String)
    status = db.Column(db.String)

现在我想通过 Flask-Restless search query 查询具有特定名称和状态的生产步骤的所有部件

这可以通过 Flask-Restless 搜索查询实现吗?如果是,我怎样才能实现指定的行为?

我正在使用 Flask-Restless 版本 0.17.0。


我尝试了以下过滤器:

q="filters":["and":["name":"production_steps__name","op":"==","val":"cutting",
    "name":"production_steps__status","op":"any","val":"done"]]

这会导致以下错误:

sqlalchemy.exc.InvalidRequestError:无法将集合与对象或集合进行比较;使用 contains() 来测试成员资格。

这听起来很合理,所以我也尝试了以下方法:

q="filters":["and":
    ["name":"production_steps","op":"any","val":"name":"name","op":"eq","val":"cutting",
    "name":"production_steps","op":"any","val":"name":"status","op":"eq","val":"done"]
]

此查询确实有效,但它确实返回仅匹配其中一个标准的零件(例如,状态不是“完成”的生产步骤“切割”的零件)

【问题讨论】:

最后一个查询有 2 个独立的 EXISTS 子查询表达式,所以你确实得到了它的要求,但是你需要在一个 EXISTS 表达式中包含两个谓词,Flask-Restless 似乎不会目前支持,至少一目了然。 是的,我猜你是对的。在此期间我还没有找到任何方法来做到这一点,所以如果你愿意写一个,我会接受你的解释作为答案。无论如何,感谢您的调查! 【参考方案1】:

正如 cmets 中所讨论的,Flask-Restless 似乎不支持这样的查询。

两种可能的解决方法:

    执行两个搜索查询:首先获取所有具有正确名称和状态的 ProductionSteps 的 Id。第二次使用 in 运算符查询在 production_steps 数组中具有一个 ID 的所有部件。

    实现您自己的返回所需零件的路线。代码可能如下所示:

    @app.route('/part/outstanding', methods=['GET'])
    def parts_outstanding():
    
        result = Part.query.join(Part.production_steps) \
            .filter_by(status='outstanding').all()
    
        #Custom serialization logic
        result_json = list(map(lambda part: part.to_dict(), result))
        return jsonify(
            num_results=len(result),
            objects=result_json,
            page=1,
            total_pages=1
        )
    

我主张做两个搜索查询。实现自己的路由似乎有点 hacky。

【讨论】:

以上是关于搜索关系属性的完全匹配的主要内容,如果未能解决你的问题,请参考以下文章

数据表搜索标题搜索列上的完全匹配

首先对 CoreData NSFetchRequest 完全匹配进行排序

iOS 基于 Cotains 的谓词搜索仅在找到完全匹配时返回

使用 VBA 宏在 excel 行中搜索字符串的完全匹配

MongoDB 索引文本搜索仅适用于完全匹配

Rails,Ransack:如何在 HABTM 关系中搜索“所有”匹配项而不是“任何”匹配项