搜索关系属性的精确匹配
Searching an exact match for the attribute of a relation
我有以下 SQLAlchemy 数据库模型,描述了经过多个生产步骤的零件:
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.[=15= 查询所有具有特定名称和状态的生产步骤的零件]
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: Can't compare a collection to an object or collection; use contains() to test for membership.
这听起来很有道理,所以我也尝试了以下方法:
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"}}]
}]}
此查询确实有效,但它 return 部分仅符合一个条件(例如,生产步骤 "cutting" 的部分状态不是 "done")
如评论中所述,Flask-Restless 似乎不支持这样的查询。
两种可能的解决方法:
- 执行两个搜索查询:首先获取具有正确名称和状态的 ProductionSteps 的所有 ID。其次使用
in
运算符查询在 production_steps 数组中具有其中一个 ID 的所有部分。
实施你自己的 returns Parts 想要的路线。代码可能看起来像这样:
@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
)
我提倡做两个搜索查询。实现自己的路线似乎有点老套。
我有以下 SQLAlchemy 数据库模型,描述了经过多个生产步骤的零件:
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.[=15= 查询所有具有特定名称和状态的生产步骤的零件]
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: Can't compare a collection to an object or collection; use contains() to test for membership.
这听起来很有道理,所以我也尝试了以下方法:
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"}}]
}]}
此查询确实有效,但它 return 部分仅符合一个条件(例如,生产步骤 "cutting" 的部分状态不是 "done")
如评论中所述,Flask-Restless 似乎不支持这样的查询。
两种可能的解决方法:
- 执行两个搜索查询:首先获取具有正确名称和状态的 ProductionSteps 的所有 ID。其次使用
in
运算符查询在 production_steps 数组中具有其中一个 ID 的所有部分。 实施你自己的 returns Parts 想要的路线。代码可能看起来像这样:
@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 )
我提倡做两个搜索查询。实现自己的路线似乎有点老套。