【问题标题】:Augmenting Flask-SqlAlchemy declarative base增强 Flask-SqlAlchemy 声明性基础
【发布时间】:2014-05-06 05:19:07
【问题描述】:

我尝试了以下方法,它似乎有效:

class BaseModel(db.Model):
    __abstract__ = True

    row_ver = db.Column(db.Integer, nullable=False)

    @declared_attr
    def __mapper_args__(cls):
        return {'version_id_col': cls.row_ver}

    def to_dict(self):
        res = dict()
        for c in self.__table__.columns:
            value = getattr(self, c.name)
            if isinstance(value, date):
                res[c.name] = value.isoformat()
            elif isinstance(value, uuid.UUID):
                res[c.name] = str(value)
            else:
                res[c.name] = value
        return res

class Account(BaseModel):
    __tablename__ = 'account'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), nullable=False)

我不确定这是否是扩充声明性基类(即 db.Model 类)的正确方法。上面的代码有什么问题吗?

还相关:是否可以通过继承 db.Model(它本身就是声明性基础)来创建自定义声明性基础,如下所示:

class Base(db.Model):
    #some code here

from sqlalchemy.ext.declarative import declarative_base 
BaseModel = declarative_base(cls=Base)

class Account(BaseModel)
    #...

【问题讨论】:

    标签: python sqlalchemy flask flask-sqlalchemy


    【解决方案1】:

    要自定义db.Model,请声明flask_sqlalchemy.Model 的超类并将其传递给model_class,如下所示。

    from flask_sqlalchemy import Model, SQLAlchemy
    
    
    class AppModel(Model):
        row_ver = db.Column(db.Integer, nullable=False)
    
    
    db = SQLAlchemy(model_class=AppModel)
    
    
    class Account(db.Model):
        pass
    
    
    class Thing(db.Model):
        pass
    

    请注意,AccountThing 继承自 db.Model,而不是 AppModel

    【讨论】:

      猜你喜欢
      • 2015-02-25
      • 2015-07-09
      • 2010-10-22
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      相关资源
      最近更新 更多