'Marshmallow' 对象没有属性 'ModelSchema'

'Marshmallow' object has no attribute 'ModelSchema'

文档中的一切看起来都很好,但是当我 运行 应用程序时它仍然给我这个错误:

  File "main.py", line 21, in <module>
    class UserSchema(ma.ModelSchema):
AttributeError: 'Marshmallow' object has no attribute 'ModelSchema'

一切都已正确导入。数据库已提交。 pipenv 和 venv 上的行为相同。

我是不是漏掉了什么?

from flask import Flask, jsonify
from flask_sqlalchemy import SQLAlchemy 
from flask_marshmallow import Marshmallow

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///marshmallowjson.db'

db  = SQLAlchemy(app)
ma = Marshmallow(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))

class Item(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    item_name = db.Column(db.String(50))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    user = db.relationship('User', backref='items')

class UserSchema(ma.ModelSchema):
    class Meta:
        model = User 
        
class ItemSchema(ma.ModelSchema):
    class Meta:
        model = Item

@app.route('/')
def index():
    users = User.query.all()
    user_schema = UserSchema(many=True)
    output = user_schema.dump(users).data
    return jsonify({'user': output})

if __name__ == '__main__':
    app.run(debug=True)

我讨厌它发生,但我在发布后立即得到了答案...

只安装了 flask-marshmallow,但是

pipenv install marshmallow-sqlalchemy

需要添加才能与 SQLAlchemy 一起使用。整个代码保持不变。

也许它会对某人有所帮助... 现在我遇到了一个不同的问题,但那是另一回事了。

我安装了 marshmallow-sqlalchemy,但我仍然得到 'Marshmallow' 对象没有属性 'ModelSchema'。对我来说,以下解决了问题。

from marshmallow_sqlalchemy import ModelSchema

class UserSchema(ModelSchema):
    class Meta:
        model = User

我为此苦苦挣扎了 2 天。没有任何效果,最后我将 marshmallow-sqlalchemy 的版本从 0.23.0 更改为 0.22.3

pip uninstall marshmallow-sqlalchemy
pip install marshmallow-sqlalchemy==0.22.3

错误消失了。 我希望没有其他人像我一样浪费他们的时间。

使用 SQLAlchemySchema 或 SQLAlchemyAutoSchema 从您的模型生成棉花糖模式。 https://flask-marshmallow.readthedocs.io/en/latest/

from flask_marshmallow import Marshmallow
from .models import Author

ma = Marshmallow()

class AuthorSchema(ma.SQLAlchemySchema):
    class Meta:
        model = Author

    id = ma.auto_field()
    name = ma.auto_field()
    books = ma.auto_field()

Conf.py

from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow

db = SQLAlchemy(app)
ma = Marshmallow(app) 

#烧瓶棉花糖<0.12.0

class UserSchema(ma.ModelSchema):
      class Meta:
            model = User

#flask-marshmallow>=0.12.0(推荐)

from conf import ma
class UserSchema(ma.SQLAlchemyAutoSchema):
      class Meta:
            model = User
            load_instance = True

#flask-marshmallow>=0.12.0(不推荐)

from marshmallow_sqlalchemy import ModelSchema
class UserSchema(ModelSchema):
      class Meta:
            model = User
            sql_session = db.session

来自https://github.com/marshmallow-code/flask-marshmallow/issues/56

See https://github.com/marshmallow-code/flask-marshmallow/blob/dev/CHANGELOG.rst#0120-2020-04-26 . It is recommended that you use the newer SQLAlchemySchema rather than ModelSchema.

重大更改ma.ModelSchemama.TableSchema 已删除,因为上游已弃用它们。

于 2020 年更改为 Schema 而不是 ModelSchema

查看官方发行说明https://flask-marshmallow.readthedocs.io/en/latest/

随着 Flask-Marshmallow 0.12.0 (2020-04-26) 的发布,ma.ModelSchema 被弃用了。 您应该切换到 ma.SQLAlchemySchemama.SQLAlchemyAutoSchema

https://flask-marshmallow.readthedocs.io/en/latest/changelog.html#id2

查看更多

发布新版本时,显示此错误。 重大更改:ma.ModelSchema 和 ma.TableSchema 已删除,因为上游已弃用它们。

请卸载您当前的软件包并使用此版本安装它们。

Click==7.0
Flask==1.1.1
Flask-Cors==3.0.8
Flask-Login==0.5.0
flask-marshmallow==0.9.0
Flask-SQLAlchemy==2.4.1
Flask-WTF==0.14.3
itsdangerous==1.1.0
Jinja2==2.11.1
MarkupSafe==1.1.1
marshmallow==2.20.5
marshmallow-sqlalchemy==0.18.0
six==1.14.0
SQLAlchemy==1.3.13
Werkzeug==1.0.0
WTForms==2.2.1

祝你好运

太棒了!它在较新版本中已被弃用。

class UserSchema(ma.ModelSchema):
class Meta:
    model = User 

将其更改为

class UserSchema(ma.SQLAlchemyAutoSchema):
class Meta:
    model=User
    load_instance=True

现在应该可以正常使用了!!

保持阅读文档的良好习惯。适合您的解决方案可以是:

class UserSchema(ma.ModelSchema):
    class Meta:
        model = User 

就我而言,我使用的是版本 14。 所以随着时间的推移,它们可能会改变。为此,请参阅文档: https://flask-marshmallow.readthedocs.io/en/latest/