Python SQLAlchemy声明中基于对象的默认值

Python SQLAlchemy声明中基于对象的默认值,python,sqlalchemy,hook,Python,Sqlalchemy,Hook,使用SQLAlchemy,可以为每个函数添加默认值。据我所知,这也可能是可调用的(不带任何参数或带有可选的ExecutionContext参数) 现在在一个声明性场景中,我想知道是否有可能使用存储的对象调用一个默认函数。也就是说,可能是这样: Base = sqlalchemy.ext.declarative.declarative_base() class BaseEntity(Base): value = Column('value', String(40), default=Bas

使用SQLAlchemy,可以为每个函数添加默认值。据我所知,这也可能是可调用的(不带任何参数或带有可选的ExecutionContext参数)

现在在一个声明性场景中,我想知道是否有可能使用存储的对象调用一个默认函数。也就是说,可能是这样:

Base = sqlalchemy.ext.declarative.declarative_base()
class BaseEntity(Base):
    value = Column('value', String(40), default=BaseEntity.gen_default)

    def gen_default(self):
        # do something with self, for example
        # generate a default value using some other data
        # attached to the object
        return self.default_value

这样的事情可能吗?或者我是否必须为此设置插入前挂钩(如何设置?)

在此处记录插入前:

示例如下:

i、 e

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import event

Base= declarative_base()

class A(Base):
    __tablename__ = "a"


    id = Column(Integer, primary_key=True)
    data = Column(String)
    otherdata = Column(String)

@event.listens_for(A, "before_insert")
def gen_default(mapper, connection, instance):
    instance.data = "Some default %s" % instance.otherdata

e = create_engine("sqlite://")
Base.metadata.create_all(e)

a = A(otherdata="some other data")
s = Session(e)
s.add(a)
s.commit()

assert a.data == "Some default some other data"