2016-05-29 17 views
4

は、我々はこのように、flask_sqlalchemyからではなくsqlalchemyからModelクラスを使用します。フラスコSQLAlchemy:基本モデルクラスを拡張する方法?フラスコ/ SQLAlchemyので

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 

app = Flask(__name__) 
db = SQLAlchemy(app) 

class Foo(db.Model): 
    bar = db.Column(db.String) 

私は私が定義するすべてのモデルに追加する機能を持っています。基本クラスをいくつか拡張してそこに関数を追加したいので、自分自身を繰り返す必要はありません。通常のSQLAlchemyでは、これを行うために宣言的な基底クラスを拡張することができます。 flask_sqlalchemyでこれをどのように達成できますか? db.Modelクラスから拡張

は上げずに動作しません:

InvalidRequestError: Class does not have a table or tablename specified and does not inherit from an existing table-mapped class.

答えて

8

あなたは__abstract__ = Trueを設定することで、エラーを修正することができます。私はあなたの例を修正:

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 

app = Flask(__name__) 
db = SQLAlchemy(app) 

class Foo(db.Model): 
    __abstract__ = True 
    bar = db.Column(db.String) 

__abstract__the documentationに記載されています。また、mixin classを使用することもできます。

コードをさらに必要とする場合は、SQLAlchemyをサブクラス化し、そのmake_declarative_base()メソッドをオーバーライドすることによって、宣言ベースクラスをオーバーライドすることもできます。例:

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy, Model, _BoundDeclarativeMeta, _QueryProperty 
from sqlalchemy.ext.declarative import declarative_base 

app = Flask(__name__) 

class MyModel(Model): 
    ... 

class MySQLAlchemy(SQLAlchemy): 
    def make_declarative_base(self, metadata=None): 
     base = declarative_base(cls=MyModel, name='MyModel', 
           metadata=metadata, 
           metaclass=_BoundDeclarativeMeta) 
     base.query = _QueryProperty(self) 
     return base 

db = MySQLAlchemy(app) 

「通常どおり」db.Modelをサブクラス化します。

+0

私はこれを行う別の方法を追加しました。私はSQLAlchemyの専門家ではないので、これも正しいと思います。 –

+0

それは面白いです - クールです。私は今のところ最初の道に固執するでしょう。 –

関連する問題