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
2つの列を持つテーブルの場合、それは許容できるかもしれませんが、10以上の列を持つテーブルがある場合はどうなりますか?新しいモデルを定義するたびにコンストラクタhaveを定義するのですか?
ほとんどの場合、モデルクラスでコンストラクタを定義しないと、正しい動作が得られます。
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(User(username='myname',email='my@email',password='mypassword'))
。
この小さな問題に遭遇することはよくあることですが、特定するのは困難です。これがお役に立てば幸いです。
コンストラクタは自由に記述できますが、オブジェクトをデータベースに保存する前に、各フィールドを初期化する必要があります。
class User(db.Model):
...
user = User()
user.username = 'foo'
user.email = '[email protected]'
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