搜索关系属性的完全匹配

时间:2018-01-10 12:47:13

标签: python sqlalchemy flask-sqlalchemy flask-restless

我有以下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"}}]
}]}

此查询确实有效,但它确实返回仅与其中一个标准相匹配的部分(例如,具有生产步骤“切割”的部分,其中状态未“完成”)

1 个答案:

答案 0 :(得分:1)

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

两种可能的工作方式:

  1. 执行两个搜索查询:首先获取具有正确名称和状态的所有ProductionSteps ID。第二个查询具有in运算符的production_steps数组中具有一个Ids的所有部件。
  2. 实现您自己的路线,返回所需的零件。代码可能如下所示:

    @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
        )
    
  3. 我主张做两个搜索查询。实现你自己的路线似乎有点hacky。