2016-05-29 10 views
4

In Flask/SQLAlchemy, verwenden wir die Model Klasse von flask_sqlalchemy statt aus sqlalchemy, wie folgt aus:Flask SQLAlchemy: Wie erweitert man die Basismodellklasse?

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 

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

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

Ich habe eine Funktion, die ich zu jedem Modell hinzufügen Ich definiere. Ich möchte einige Basisklassen erweitern und die Funktion dort hinzufügen, damit ich mich nicht wiederholen muss. Mit normalen SQLAlchemy können wir die deklarative Basisklasse dazu erweitern. Wie können wir dies in flask_sqlalchemy erreichen?

erstreckt sich von der db.Model Klasse funktioniert nicht ohne Erhöhung:

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

Antwort

8

Sie können den Fehler beheben, indem __abstract__ = True Einstellung. Ich änderte Ihr Beispiel:

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__ in the documentation beschrieben. Alternativ können Sie eine mixin class verwenden.

Wenn Sie mehr Code benötigen, können Sie die deklarative Basisklasse auch durch Unterklassen SQLAlchemy und Überschreiben der make_declarative_base()-Methode überschreiben. Beispiel:

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) 

und dann Unterklassen db.Model "wie üblich".

+0

Ich fügte einen anderen Weg hinzu, dies zu tun. Ich bin kein großer SQLAlchemy-Experte, also hoffe ich, dass dies auch richtig ist. –

+0

Das ist interessant - cool. Ich bleibe für den ersten Weg. –

Verwandte Themen