【问题标题】:Bad request for POST with relationship using flask-restless使用 flask-restless 对 POST 的错误请求与关系
【发布时间】:2014-08-11 20:03:12
【问题描述】:

我正在使用 flask-restless 并在我的第一个 POST(来自 Postman)时收到错误请求 (400) 错误。如果我继续提出相同的请求,它就会不断出错。但是,如果我删除 flask-restless 抱怨的字段,再次运行 POST,得到肯定的响应,重新添加相同的字段,然后再次运行,从那时起它就可以正常工作了。

网址:/api/appraisals

请求 JSON:

{
    "suggested_price": 88,
    "listing": {"id": 1}
}

错误响应:

{
    "message": "Model does not have field 'listing'"
}

app.py:

from models.db import init_app
from controllers import api


app = Flask(__name__)
app.config.from_object('config')
init_app(app)

api.init_api(app)

来自models.db.py:

 from flask.ext.sqlalchemy import SQLAlchemy

 def init_app(app):
      with app.app_context():
           db.init_app(app)
           db.create_all()

 db = SQLAlchemy()

来自 controllers.api.py:

 from flask.ext.restless import APIManager

 class ResourceManager(APIManager): ...

 def init_api(app):
      with app.app_context():
           manager = ResourceManager(app, flask_sqlalchemy_db=db)
           manager.add_resource(ListingResource())
           manager.add_resource(AppraisalResource())

来自models.appraisal.py:

 from .db import db
 from .base import BaseModel


 class Appraisal(BaseModel):

      __tablename__ = "appraisal"

      # required fields
      suggested_price = db.Column(db.Integer, nullable=False)

      # optional fields
      currency = db.Column(db.Unicode, default=u"USD")

      # relationships
      listing_id = db.Column(db.Integer, db.ForeignKey('listing.id'))

来自models.listing.py:

 from sqlalchemy.schema import UniqueConstraint

 from .db import db
 from .base import BaseModel

 class Listing(StatusfulModel, BaseModel):

     __tablename__ = "listing"

     # relationships
     appraisals = db.relationship(
         "Appraisal",
         backref=db.backref("listing", uselist=False),
         uselist=True)

来自 controllers.resource.appraisal.py:

 class AppraisalResource(Resource):

      model_class = Appraisal
      base_url = "appraisals"
      allowed_methods = ["POST", "GET"]

      def get_fields(self):
           super_fields = super(AppraisalResource, self).get_fields()

           return super_fields + [
                "listing",
                "listing.id"
           ]

【问题讨论】:

  • 两个问题: 1. 你用什么来发出POST 请求? 2.ListingResource长什么样子?
  • 你试过用listing_id代替listing吗?
  • @OrDuan listing_id 有效。这是正确的方法吗?
  • @EvanHammer 我发布了一个答案,因为它很想发表评论

标签: python flask flask-sqlalchemy flask-restless


【解决方案1】:

我认为解释如何解决此错误的最佳方式是告诉您我在考虑时的想法。

您会经常使用 API 进入这些情况,并且了解如何考虑逻辑是很重要的。

  1. 您收到错误 400 - 这意味着您发送了 JSON 但不是 Flask 期望的格式。
  2. 根据您的问题,删除列表字段解决了问题 - 感觉我们越来越近了。
  3. 我查看了您尝试更改的模型(/api/appraisals) - 评估
  4. 你的模特:

    class Appraisal(BaseModel):
        __tablename__ = "appraisal"
    
        suggested_price = db.Column(db.Integer, nullable=False)
        currency = db.Column(db.Unicode, default=u"USD")
        listing_id = db.Column(db.Integer, db.ForeignKey('listing.id'))
    
  5. 查看后,您可以看到 Flask 期待“listing_id” - 而不是“listing”

我希望我很清楚,如果您需要任何帮助,请告诉我。 祝你好运!

【讨论】:

  • 感谢您,因为这解决了问题。谢谢你!但是错误的不稳定性质是烧瓶不安定的问题。我两次发送相同的请求:一次失败,一次有效。此外,listing 是 Appraisal 对象上的关系。如果你列出它的RelationshipProperty,你可以看到它。
猜你喜欢
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 2016-10-01
  • 2016-08-25
  • 2018-04-13
  • 2015-05-24
  • 2022-07-11
相关资源
最近更新 更多