The*_*era 12 python sqlalchemy class
我正在尝试为具有名称的物质(用于实验室中常用的名称)和长名称的另一列(如果名称实际上不完整)编写一个类.是否有一些怀疑告诉班级只是将名称字段的值复制到长名称字段,以防未指定长名称?
我试过这样的事情:
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=name)
Run Code Online (Sandbox Code Playgroud)
但这失败了,因为name
未定义.还有什么我可以做的吗?
r-m*_*m-n 19
您可以创建上下文相关的默认功能
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)
Run Code Online (Sandbox Code Playgroud)
vil*_*vil 12
除了rmn的答案,如果你有多个列默认为另一个的值,你可以编写一个辅助函数来避免编写许多默认函数.
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'))
Run Code Online (Sandbox Code Playgroud)