Python 炼金术构造器

Python 炼金术构造器,python,sqlalchemy,flask,flask-sqlalchemy,Python,Sqlalchemy,Flask,Flask Sqlalchemy,在Flask SQLAlchemy教程中,定义了用户模型的构造函数: from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db' db = SQLAlchemy(app) class User(db.Model): id = db.Co

在Flask SQLAlchemy教程中,定义了用户模型的构造函数:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

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


class User(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)

    def __init__(self, username, email):
        self.username = username
        self.email = email

对于一个有两列的表,这可能是可以接受的,但是如果我有10+列的表呢?每次我定义新模型时,是否都要定义构造函数

您可以根据需要编写构造函数,只需在尝试将对象保存到数据库中之前初始化每个字段即可

class User(db.Model):
    ...

user = User()
user.username = 'foo'
user.email = 'foo@bar.com'
db.session.add(user)
您也可以用这种方式初始化构造函数中的参数

class User(db.Model):
    ...
    def __init__(self, username, email):
        self.username = username
        self.email = email
        self.password = generate_random_password()
        self.last_login = None

在大多数情况下,不在模型类中定义构造函数可以提供正确的行为

Flask SQLAlchemy的基本模型类(也是SQLAlchemy的声明性基类),它只接受
**kwargs
并存储所有给定的参数,因此实际上不需要定义构造函数

如果您确实需要定义一个构造函数来执行某些特定于模型的初始化,请按如下操作:

class User(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)

    def __init__(self, **kwargs):
        super(User, self).__init__(**kwargs)
        # do custom initialization here

通过让基类处理
**kwargs
您将自己从初始化模型字段的复杂性中解放出来。

我知道这有点旧,但无论如何,它应该对其他有类似问题的人有用。 如果遇到“TypeError:init()正好接受1个参数(给定2个)”-这意味着您需要在创建要添加到数据库的对象时提供关键字,如下所示:

db.session.add(用户(username='myname',email='name')my@email“,password='mypassword'))

遇到这个小问题是很常见的……但很难发现。
我希望这能有所帮助。

谢谢迈克尔。我的问题是,当我省略模型构造函数时,我得到了这样一个结果:“TypeError:\uuuu init\uuuuuu()正好接受1个参数(给定2个)”。你知道是什么原因造成的吗?当你构造一个对象的时候,你在传递值吗?我在做:db.session.add(User('myname'),'my@email,mypassword')。而您的构造函数接受用户名、电子邮件和密码?是的,确切地说是:def uu init uu(self、用户名、电子邮件、密码):self.username=username-self.email=email-self.password=password伟大的答案。你的博客、书和答案让我可以使用你的烧瓶。在这个问题上,有没有可能稍微升级一下答案,以适应更复杂的情况,我认为这是使用用户mixin的常见情况?例如,我正在使用
flask\u security.UserMixin
。我认为这比我发布一个几乎相同的问题更有用。