Я создаю flask_restful
API с sqlalchemy
и marshmallow
. Вот моя модель
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' не имеет атрибута '_sa_instance_state'
Когда я удаляю схему вложенного профиля из UserSchema
, ошибки нет, но user.profile
не будет обновлен. Кроме того, когда я удаляю параметр instance=user
в schema.load(data, instance=user)
, ошибки нет, и я получаю прекрасный экземпляр пользователя с опубликованными данными, проблема здесь снова в том, что не будет никакой связи между этим экземпляром пользователя и экземпляром, существующим в базу данных, мне придется вручную определять, какое поле пользователя нужно обновить.