2014-04-10 9 views
8

Vorrei dichiarare una classe base che tutti gli oggetti altro schema può ereditare, per esempio:Come si dichiara una classe del modello base in Flask-SQLAlchemy?

class Base(db.Model): 
    created_on = db.Column(db.DateTime, default=db.func.now()) 
    updated_on = db.Column(db.DateTime, default=db.func.now(), onupdate=db.func.now()) 

Poi tutti gli altri oggetti schema può ereditare da esso e non devono ripetere la dichiarazione dei due colonne.

Come farei questo in Flask-SQLAlchemy?

from flask.ext.sqlalchemy import SQLAlchemy 
db = SQLAlchemy(app) 

class User(db.Model): 
    __tablename__ = 'users' 
    id = db.Column(db.Integer, primary_key = True) 
    email = db.Column(db.String(255), unique = True) 

risposta

30

SQLAlchemy offre un directive called __abstract__. Puoi usarlo per dire a SQLAlchemy di non creare la tabella per un particolare modello. Quel modello può essere usato come classe base.

from flask.ext.sqlalchemy import SQLAlchemy 
db = SQLAlchemy(app) 

class Base(db.Model): 
    __abstract__ = True 

    created_on = db.Column(db.DateTime, default=db.func.now()) 
    updated_on = db.Column(db.DateTime, default=db.func.now(), onupdate=db.func.now()) 


class User(Base): 
    __tablename__ = 'users' 
    id = db.Column(db.Integer, primary_key = True) 
    email = db.Column(db.String(255), unique = True) 
+1

Questo è il trucco. Inoltre, per semplificare un po ', puoi rimuovere il '__tablename__' nei figli e aggiungere al genitore: @declared_attr def' __tablename__' (cls): return cls.'__name__'.lower() – Heliodor

+0

@Heliodor Sarebbe solo il comportamento predefinito che otterresti senza il "__tablename__". '__tablename__' è stato specificato perché l'OP voleva che fosse plurale' users' piuttosto che singolare 'user'. – pydsigner

+0

Nuovo collegamento a doc: http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/api.html#abstract – siulkilulki

Problemi correlati