2014-04-10 11 views
8

Chciałbym zadeklarować klasę bazową, która sprzeciwia wszystkie inne schematu może dziedziczyć, na przykład:Jak zadeklarować klasę modelu podstawowego w 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()) 

Wtedy wszystkie inne obiekty schematu może dziedziczyć z niej i nie trzeba powtarzać deklarację dwóch kolumny.

Jak to zrobić w 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) 

Odpowiedz

30

SQLAlchemy oferuje directive called __abstract__. Możesz go użyć, aby powiedzieć SQLAlchemy, aby nie tworzył tabeli dla konkretnego modelu. Ten model może być użyty jako twoja klasa bazowa.

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

To działa. Ponadto, aby trochę uprościć, możesz usunąć '__tablename__' w grupie dzieci i zamiast tego dodać do elementu nadrzędnego: @declared_attr def' __tablename__' (cls): return cls.'namename__' .lower() – Heliodor

+0

@Heliodor To byłoby domyślne zachowanie, które otrzymałeśby bez '__tablename__' w ogóle. "__tablename__" zostało określone, ponieważ OP chciał, aby był to liczba mnoga 'users' zamiast pojedynczego' user'. – pydsigner

+0

Nowy link do dokumentu: http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/api.html#abstract – siulkilulki