Flask-SQLAlchemy构造函数

Nig*_*Owl 24 python sqlalchemy flask flask-sqlalchemy

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

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
Run Code Online (Sandbox Code Playgroud)

对于有两列的表,这可能是可以接受的,但如果我有10列以上的表怎么办?每次定义新模型时必须定义构造函数吗?

Mig*_*uel 65

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

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
Run Code Online (Sandbox Code Playgroud)

通过让基类处理,**kwargs您可以从初始化模型字段的复杂性中解脱出来.

  • 很好的答案。您的博客、书籍和 SO 答案使我可以使用烧瓶。在这个问题上,是否可以稍微升级更复杂的答案,我认为使用用户 mixin 的常见情况?例如我使用`flask_security.UserMixin`。我认为这比我发布一个几乎相同的问题更有用。 (3认同)

Hel*_*ely 9

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

db.session.add(User(username='myname',email='my@email',password='mypassword')).

遇到这个小问题很常见......但很难发现.我希望这有帮助.


Fog*_*ird 6

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

class User(db.Model):
    ...

user = User()
user.username = 'foo'
user.email = 'foo@bar.com'
db.session.add(user)
Run Code Online (Sandbox Code Playgroud)

您也可以通过这种方式在构造函数中初始化参数。

class User(db.Model):
    ...
    def __init__(self, username, email):
        self.username = username
        self.email = email
        self.password = generate_random_password()
        self.last_login = None
Run Code Online (Sandbox Code Playgroud)

  • 谢谢迈克尔。我的问题是,当我省略模型构造函数时,我得到这个:“TypeError: __init__() 需要 1 个参数(给出 2 个)”。知道是什么原因造成的吗? (2认同)