Python Flask sqlalchemy:无法将属性字段作为关键字参数提供给构造函数

Python Flask sqlalchemy:无法将属性字段作为关键字参数提供给构造函数,python,flask,flask-sqlalchemy,Python,Flask,Flask Sqlalchemy,我正在阅读《Flask Web开发》一书,并创建了一个与flasky()类似的应用程序。我已经建立了一个用户模型: from flask_login import UserMixin from werkzeug.security import check_password_hash, generate_password_hash from app import db class User(UserMixin, db.Model): id = db.Column(db.Integer

我正在阅读《Flask Web开发》一书,并创建了一个与flasky()类似的应用程序。我已经建立了一个用户模型:

from flask_login import UserMixin
from werkzeug.security import check_password_hash, generate_password_hash

from app import db


class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)
    password_hash = db.Column(db.String)

    @property
    def password(self):
        raise AttributeError('password is read-only')

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

    def verify_password(self, password):
        return verify_password_hash(self.password_hash, password)

    def __init__(self, username, email):
        self.username = username
        self.email = email
现在在注册视图中,我执行以下操作:

user = User(email=form.email.data, username=form.username.data,
                password = form.password.data)
我得到以下错误:

TypeError: __init__() got an unexpected keyword argument 'password'
奇怪的是,教程项目也是这样做的,见第54行

当我这样做时,它会起作用:

user = User(email=form.email.data, username=form.username.data)
user.password = form.password.data

但是我希望能够将密码传递给构造函数。显然,Alchemy不理解密码是一个属性。但在教程中,这是如何工作的呢?我找不到差异。

您覆盖了
\uuuu init\uuuu
,但不允许输入密码:

def __init__(self, username, email):
    self.username = username
    self.email = email
无需重写
\uuuuu init\uuuuu
,因为默认的SQLAlchemy模型提供了一个已经接受所有字段的模型。只需删除
\uuuu init\uuuu
声明,事情就应该正常运行了


在这个例子中,Michael确实重写了
\uuuuu init\uuuuuu
方法,但他接受所有关键字参数,他做的第一件事就是将它们转发给超级构造函数(以保留SQLAlchemy的默认行为)。

Wow。。我现在感到惭愧。。真不敢相信我错过了:(谢谢!