hybrid_property 装饰器:无法设置属性错误

The hybrid_property decorator: can't set attribute error

我在 __init__.py 中创建了一个应用,如下所示:

from flask_bcrypt import Bcrypt

app = Flask(__name__, static_folder='static')
bcrypt = Bcrypt(app)

我在创建数据库模型时使用这个 app 实例,如下所示:

from sqlalchemy.ext.hybrid import hybrid_property
from app import bcrypt, db

class User(db.Model):

    name = db.Column(db.String, nullable=False)
    _password = db.Column(db.String)

    @hybrid_property
    def password(self) -> str:
        return self._password

    @password.setter
    def _set_password(self, password: str):
        self._password = bcrypt.generate_password_hash(password)

然后我尝试按如下方式启动一个实例(这是我想要的方式,因为它看起来更干净):

user = User(name='foo', password='bar')

但是当我将其提交到数据库时出现以下错误:AttributeError:无法设置属性。如果我使用:

user = User(name='foo', _password='bar')

我想我没有正确使用 @hybrid_property 装饰器?如果可能,我想使用 user = User(name='foo', password='bar') 语法。

在此感谢您的帮助。

无论您使用 @hybrid_property 装饰器还是原生 python 对象的 @property 装饰器,您都必须保留在 属性 定义中用于 setter 或getter 方法。

这里的 def _set_password() 应该是 def password()。您的代码应如下所示:

 @hybrid_property
 def password(self):
     return self._password_hash

 @password.setter
 def password(self, plaintext):
     self._password_hash = generate_password_hash(plaintext)  

详细说明:https://github.com/sqlalchemy/sqlalchemy/issues/4332