【问题标题】:How do I declare a base model class in Flask-SQLAlchemy?如何在 Flask-SQLAlchemy 中声明基本模型类?
【发布时间】:2014-04-10 00:27:57
【问题描述】:

我想声明一个基类,所有其他模式对象 可以继承自,例如:

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())

然后所有其他模式对象都可以继承它而不必重复 两列的声明。

我将如何在 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)

【问题讨论】:

    标签: flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    SQLAlchemy 提供了一个directive called __abstract__。您可以使用它来告诉 SQLAlchemy 不要为特定模型创建表。该模型可以用作您的基类。

    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)
    

    【讨论】:

    • 这可以解决问题。此外,为了简化一点,您可以删除子代中的 __tablename__ 并添加到父代:@declared_attr def __tablename__(cls): return cls.__name__.lower()
    • @Heliodor 这只是没有__tablename__ 的默认行为。指定 __tablename__ 是因为 OP 希望它是复数 users 而不是单数 user
    • 谢谢@siulkilulki。已更新。
    • @Heliodor,我尝试在基类中使用@declared_attr def __tablename__(cls): return cls.__name__.lower() + 's' 进行复数,但没有成功。有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 2016-09-27
    • 2014-05-06
    • 2020-10-02
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 2020-01-02
    • 2015-02-25
    相关资源
    最近更新 更多