การเพิ่มฐานประกาศ Flask-SqlAlchemy

ฉันลองทำสิ่งต่อไปนี้แล้ว แต่ดูเหมือนว่าจะได้ผล:

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)
    #...

person synergetic    schedule 27.03.2014    source แหล่งที่มา


คำตอบ (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

โปรดทราบว่า Account และ Thing สืบทอดมาจาก db.Model ไม่ใช่ AppModel

person Panic    schedule 27.01.2021