烧瓶躁动无法构造查询

Posted

技术标签:

【中文标题】烧瓶躁动无法构造查询【英文标题】:flask restless unable to construct query 【发布时间】:2015-09-20 20:39:07 【问题描述】:

我有两个 Flask-SQLAlchemy 模型和各自的 Flask-Restless API 端点,如下所示:

class Person(db.Model):
    person_id = db.Column(db.Integer, primary_key=True)
    document = db.Column(db.String(), unique=True)
    name = db.Column(db.String(45))

class Student(db.Model):
    student_id = db.Column(db.Integer, primary_key=True)
    person_id = db.Column(db.Integer, db.ForeignKey('person.person_id'))
    code = db.Column(db.String(45))

    person = db.relationship('Person', backref=db.backref('students', lazy='dynamic'))

manager.create_api(Person, methods=['GET', 'POST'])
manager.create_api(Student, methods=['GET', 'POST'])

这些 URL 工作正常:

http://localhost:8080/api/person http://localhost:8080/api/student

但是当我尝试按照official docs 中的描述对相关模型进行搜索查询时,我收到了 "message": "Unable to construct query" 的这些请求:

http://localhost:8080/api/person?q="filters":["name":"students__code","op":"eq","val":"1"]

http://localhost:8080/api/person?q="filters":["name":"students","op":"has","val":"name":"code","op":"eq","val":"1"]

http://localhost:8080/api/student?q="filters":["name":"person__document","op":"eq","val":"111"]

http://localhost:8080/api/student?q="filters":["name":"person","op":"any","val":"name":"document","op":"eq","val":"111"]

我正在使用 Flask 0.10.1、Flask-SQLAlchemy 2.0、Flask-Restless 0.17.0、SQLAlchemy 1.0.6 和 Python 2.7。

【问题讨论】:

【参考方案1】:

不应引用查询中的数值。

不正确:

"val":"1"

正确:

"val":1

【讨论】:

【参考方案2】:

从this 阅读(见最后一个答案)烧瓶不安的问题:

根据this section中的警告 SQLAlchemy 文档的,只能使用动态关系 对于一对多关系,而不是多对一关系。在 0.8.0b2(+) 版本中,如果您尝试对错误类型的关系使用动态关系加载器,SQLAlchemy 会引发异常。

warning 写着:

警告

“动态”加载器仅适用于集合。无效 使用多对一、一对一或 uselist=False 的“动态”加载程序 关系。较新版本的 SQLAlchemy 发出警告或 在这些情况下例外。

更新

您不能拥有动态的多对一关系。您的person 关系是 - 因为backref - 除了一对多之外,还有多对一的关系。来自docs:

以一对多的方式建立双向关系,其中 “反向”侧是多对一,指定 backref 选项。

【讨论】:

据此,我的模型中没有发现错误。

以上是关于烧瓶躁动无法构造查询的主要内容,如果未能解决你的问题,请参考以下文章

无法访问 docker 容器内的烧瓶应用程序

系统退出时无法停止python烧瓶线程

无法导入名称'日期时间'python烧瓶sqlalchemy

仍然无法将变量从烧瓶分配给 vue.js

无法使用 nginx 运行烧瓶 wsgi 应用程序

无法使用烧瓶路由到“/ login”?