I am trying to write a class for substances which has a name filed (for the name, as commonly used in the lab) and another column for the long name (in case the name is actu
You can create context-sensitive default function
def mydefault(context):
return context.get_current_parameters()['name']
class Substance(Base):
__tablename__ = "substances"
id = Column(Integer, primary_key=True)
code = Column(String, unique=True)
name = Column(String, unique=True)
long_name = Column(String, unique=True, default=mydefault)
In addition to r-m-n's answer if you have more than one column that defaults to value of another one, you can write a helper function to avoid writing many default functions.
def same_as(column_name):
def default_function(context):
return context.current_parameters.get(column_name)
return default_function
# or as a one-liner
same_as = lambda col: lambda ctx: ctx.current_parameters.get(col)
class Substance(Base):
__tablename__ = "substances"
id = Column(Integer, primary_key=True)
name = Column(String, unique=True)
long_name = Column(String, unique=True, default=same_as('name'))
created = Column(DateTime, default=datetime.now)
edited = Column(DateTime, default=same_as('created'))