【问题标题】:AttributeError: 'dict' object has no attribute '_sa_instance_state'AttributeError:“dict”对象没有属性“_sa_instance_state”
【发布时间】:2023-03-17 14:33:01
【问题描述】:

我正在使用sqlalchemymarshmallow 创建一个flask_restful API。 这是我的模型

class User(db.Model):
    """Basic user model
    """

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(80), unique=True, nullable=False)
    password = db.Column(db.String(255), nullable=False)
    active = db.Column(db.Boolean, default=True)
    is_admin = db.Column(db.Boolean, default=False)
    profile = db.relationship("Profile", back_populates="user", uselist=False)

class Profile(db.Model):
    """Profile model
    """

    id = db.Column(db.Integer, primary_key=True)
    fullname = db.Column(db.String(80), unique=False, nullable=True)
    img_url = db.Column(db.String(255), unique=False, nullable=True)
    telephone = db.Column(db.String(20), unique=False, nullable=True)
    user_id = db.Column(
        db.Integer,
        db.ForeignKey('user.id'),
        nullable=False)
    user = db.relationship("User", back_populates="profile")

这里是用于更新PUT请求的用户资源

class UserResource(Resource):

    def put(self, user_id):
        schema = UserSchema()
        user = User.query.get_or_404(user_id)

        data = {
            'username': 'updated',
            "password": 'HRcdxRu45',
            'email': 'ms@gt.vom',
            'profile': {
                'telephone': '+2507800112233',
                'fullname': 'Mic Lolo',
                'img_url': 'images/img.jpg'
            }
        }

        user = schema.load(data, instance=user)

        return {"message": "user updated", "data": schema.dump(user)}

这是我的架构

class ProfileSchema(ma.Schema):
    id = ma.Int(dump_only=True)
    fullname = ma.Str(validate=Length(min=3, max=80, error='empty fullname'))
    img_url = ma.Str(validate=Length(min=3, max=80, error='empty image url'))
    telephone = ma.Str(validate=Regexp(regex=r"\+[0-9]{7,13}", error="Invalid phone number"))

    class Meta:
        model = Profile
        sqla_session = db.session


class UserSchema(ma.ModelSchema):
    id = ma.Int(dump_only=True)
    password = ma.Str(load_only=True,
                      validate=Length(min=8, max=255, error='empty password'))
    username = ma.Str(validate=Length(min=3, max=80, error='empty username'))
    is_admin = ma.Bool()
    email = ma.Email()
    profile = ma.Nested(ProfileSchema)

    class Meta:
        model = User
        sqla_session = db.session

我得到 AttributeError: 'dict' object has no attribute '_sa_instance_state'

当我从 UserSchema 中删除嵌套配置文件架构时,没有错误,但 user.profile 不会更新。此外,当我删除 schema.load(data, instance=user) 中的 instance=user 参数时,没有错误,我将获得一个带有已发布数据的良好用户实例,这里的问题再次是该用户实例与现有的用户实例之间没有任何链接数据库,我将不得不手动查找要更新的用户字段。

【问题讨论】:

    标签: python-3.x sqlalchemy flask-restful marshmallow


    【解决方案1】:
    class ProfileSchema(ma.Schema):
    

    ProfileSchema 应该继承自 ma.ModelSchema

    【讨论】:

      猜你喜欢
      • 2013-04-15
      • 1970-01-01
      • 2022-11-06
      • 2016-01-10
      • 2021-12-27
      • 1970-01-01
      • 2016-11-14
      • 2020-07-08
      相关资源
      最近更新 更多