【问题标题】:Why does Marshmallow return empty for multiple items but returns a single item when I use first()为什么 Marshmallow 对多个项目返回空但在我使用 first() 时返回单个项目
【发布时间】:2021-06-08 18:33:01
【问题描述】:

我试图通过flask-mysqlAlchemy在一个查询中从两个表中获取数据,并且我得到了所有数据。但是当我尝试通过flask-marshmallow 转储它时,它会显示一个包含很多空对象的数组。但是,如果我将 .first() 放在查询中,它会显示两个表的第一个结果。

我创建了一个包含两个表中的每个字段的类,它像模型实体一样工作,我不确定它是否需要,但这里是它:

class HotelInfoReview(db.Model):
    __tablename__ = 'hotel_info_review'
    country_area = db.Column(db.String(45), nullable=False, primary_key=True)
    hotel_id = db.Column(db.String(32), unique=True, nullable=False, primary_key=True)
    hotel_name = db.Column(db.Text)
    hotel_url = db.Column(db.Text)
    hotel_address = db.Column(db.Text)
    review_score = db.Column(db.Float, nullable=True)
    review_qty = db.Column(db.Integer, nullable=True)
    clean = db.Column(db.Float, nullable=True)
    comf = db.Column(db.Float, nullable=True)
    loct = db.Column(db.Float, nullable=True)
    fclt = db.Column(db.Float, nullable=True)
    staff = db.Column(db.Float, nullable=True)
    vfm = db.Column(db.Float, nullable=True)
    wifi = db.Column(db.Float, nullable=True)
    uuid = (db.Column(db.String, nullable=True, primary_key=True))
    review_title = db.Column(db.Text)
    review_url = db.Column(db.Text)
    review_score = db.Column(db.Float, nullable=True)
    review_date = db.Column(db.DateTime)
    reviewer_name = db.Column(db.Text)
    hash_reviewer_name = db.Column(db.String, nullable=True)
    reviewer_location = db.Column(db.String, nullable=True)
    posting_conts = db.Column(db.Integer, nullable=True)
    positive_content = db.Column(db.Text)
    negative_content = db.Column(db.Text)
    tag_n1 = db.Column(db.Text)
    tag_n2 = db.Column(db.Text)
    tag_n3 = db.Column(db.Text)
    tag_n4 = db.Column(db.Text)
    tag_n5 = db.Column(db.Text)
    staydate = db.Column(db.Text)

然后我定义了像文档说的输出方法:

class HotelInfoReviewSchema(ma.Schema):
    class Meta:
        fields = ('country_area', 'hotel_id', 'hotel_name', 'hotel_url', 'hotel_address', 'review_score', 'review_qty',
                  'clean', 'comf', 'loct', 'fclt', 'staff', 'vfm', 'wifi', 'uuid', 'review_title', 'review_url',
                  'review_date', 'reviewer_name', 'hash_reviewer_name', 'reviewer_location', 'posting_conts',
                  'positive_content', 'negative_content', 'tag_n1', 'tag_n2', 'tag_n3', 'tag_n4', 'tag_n5')


hotel_info_review_schema = HotelInfoReviewSchema()
hotels_info_review_schema = HotelInfoReviewSchema(many=True)

最后我为转储结果创建了一个路由:

@app.route('/HotelsAndReviews')
def get_reviews():
    data = db.session.query(HotelInfo, HotelReview)
    .join(HotelReview, HotelReview.hotel_id == HotelInfo.hotel_id)
    .filter((HotelReview.review_date.between('2018-01-01', '2019-12-12')))

    result = hotels_info_review_schema.dump(data)
    return jsonify(result)

我错过了什么?我知道这个问题已经被回答了,但是这个回答对我不起作用,因为我已经在我的代码中应用了这个答案。 谢谢!

【问题讨论】:

    标签: python flask-restful marshmallow


    【解决方案1】:

    尝试在查询后使用 .all(),这会检索所有数据,如果仍然不起作用,请从 marshmallow_sqlalchemy 导入 ModelSchema 并在 ma.schema 中使用 ModelSchema 类。所以应该看起来像这样“class HotelInfoReviewSchema(ModelSchema):”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多