1

我有两个 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

但是,当我尝试按照官方文档中的描述对相关模型进行搜索查询时,我得到{ "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。

4

2 回答 2

2

不应引用查询中的数值。

不正确:

"val":"1"

正确的:

"val":1
于 2015-10-03T19:19:58.463 回答
1

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

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

警告内容如下:

警告

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

更新

您不能拥有动态的多对一关系。您的person关系是 - 因为backref- 除了一对多之外,还有多对一的关系。从文档

要在一对多中建立双向关系,其中“反向”侧是多对一,请指定 backref 选项。

于 2015-07-04T08:56:16.917 回答