烧瓶不安,无法构建查询

时间:2015-07-03 05:53:21

标签: python flask sqlalchemy flask-sqlalchemy flask-restless

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

这些网址可以正常使用:

  • 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。

2 个答案:

答案 0 :(得分:2)

不应引用查询中的数值。

不正确:

"val":"1"

正确:

"val":1

答案 1 :(得分:1)

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

  

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

warning读取:

  

警告

     

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

<强>更新

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

  

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