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错误是因为production_steps是一对多关联的集合,你不能直接把集合的属性(比如production_steps__name)和单个值做相等比较,也不能用这种方式结合any操作符——必须针对整个关联对象集合使用any或has操作,而非单独的属性字段。
第二个过滤器逻辑不对的原因
第二个写法:
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"}}] }]}
虽然能正常执行,但逻辑是**“零件存在一个叫cutting的工序,并且存在一个状态为done的工序”**——这两个工序可以是不同的,所以会返回那些只有cutting工序(状态不是done)或者只有done工序(名称不是cutting)的零件,和你想要的“存在一个工序同时满足name=cutting且status=done”完全不符。
正确的过滤器写法
要精准找到存在至少一个生产工序同时满足name=cutting和status=done的零件,你需要把两个条件嵌套在同一个any操作符的val里,用and组合起来:
q={"filters": [{ "name": "production_steps", "op": "any", "val": { "and": [ {"name": "name", "op": "eq", "val": "cutting"}, {"name": "status", "op": "eq", "val": "done"} ] } }]}
这个过滤器的核心逻辑是:查询所有零件,其中存在至少一个ProductionStep对象,该对象同时满足name='cutting'和status='done',完全匹配你的需求。
等价的ORM查询验证
这个过滤器对应的SQLAlchemy ORM原生查询是:
from sqlalchemy import and_ Part.query.filter(Part.production_steps.any( and_(ProductionStep.name == 'cutting', ProductionStep.status == 'done') )).all()
Flask-Restless 0.17.0完全支持这种嵌套的过滤器写法,你可以直接使用上面的JSON过滤器进行查询。
内容的提问来源于stack exchange,提问作者Phonolog
相关产品推荐
相关产品推荐

