在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
对于有两列的表,这可能是可以接受的,但是如果我有10列以上的表呢?每次定义新模型时都要定义构造函数有吗?
答案 0 :(得分:60)
在大多数情况下,不在模型类中定义构造函数会为您提供正确的行为。
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
,您可以摆脱初始化模型字段的复杂性。
答案 1 :(得分:8)
我知道这有点旧,但无论对其他有类似问题的人都有用。 如果您遇到“TypeError: init ()只需要1个参数(给定2个)” - 这意味着您需要在创建要添加到数据库的对象时提供关键字,如下所示:
db.session.add(User(username='myname',email='my@email',password='mypassword'))
。
遇到这个小问题很常见......但很难发现。 我希望这会有所帮助。
答案 2 :(得分:4)
您可以根据需要编写构造函数,在尝试将对象保存到数据库之前,只需要初始化每个字段。
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