web-dev-qa-db-ja.com

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

2つの列を持つテーブルの場合、それは許容できるかもしれませんが、10以上の列を持つテーブルがある場合はどうなりますか?新しいモデルを定義するたびにコンストラクタhaveを定義するのですか?

27
NightOwl

ほとんどの場合、モデルクラスでコンストラクタを定義しないと、正しい動作が得られます。

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を処理させることで、モデルのフィールドを初期化する複雑さから解放されます。

64
Miguel

私はこれが少し古いことを知っていますが、同様の問題を抱えている他の人に役立つはずです。 「TypeError:init()は正確に1つの引数(2つ指定)を受け取ります」に遭遇した場合、次のようにデータベースに追加するオブジェクトを作成するときにキーワードを指定する必要があります。

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

この小さな問題に遭遇することはよくあることですが、特定するのは困難です。これがお役に立てば幸いです。

9
Helen Neely

コンストラクタは自由に記述できますが、オブジェクトをデータベースに保存する前に、各フィールドを初期化する必要があります。

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
4
FogleBird