我正在使用sqlalchemy
. 我有orm
-模型:
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql.schema import Column
from sqlalchemy.sql.sqltypes import BigInteger
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
ModelWorker = declarative_base(name='ModelGenerator')
Engine = create_engine('sqlite://', echo=False)
Session = sessionmaker(bind=Engine)
class MyField(Column):
pass
class MyModel(ModelWorker):
__tablename__ = 'my_model'
id = Column(BigInteger, primary_key=True)
value = MyField(BigInteger)
ModelWorker.metadata.create_all(Engine)
model = MyModel(id=1, value=100)
session = Session()
session.add(model)
session.commit()
我想自定义该字段value
,以便在为其分配值时,例如,它将添加10
( model = MyModel(id=1, value=100);model.value == 110
) 到它。我是否需要以某种方式更改课程MyField
或MyModel
为此,以及如何做到这一点?
答案比我想象的要复杂一些。一方面,它很简单:
而且一次使用就足够了。为了在不同的模型中使用,每次都写字段的名称是非常糟糕和丑陋的。因此,您可以这样做:
这里有一个意想不到的功能。当我们调用时,问题就出现
isinstance(field_class, MyField)
了,当类被初始化时,所有的字段都被翻译了Column -> InstrumentedAttribute
:要获取原始列列表,您需要参考
MyModel.__table__.columns
: