2016-04-12 151 views
6

我正在尝试编写一个提交名称(名称,正如实验室中常用的名称)和另一列名称(在这个名字实际上是不完整的)。如果没有指定长名称,是否有人告诉类将名称字段的值复制到长名称字段?SQLAlchemy将一列的默认值设置为另一列的默认值

我想是这样的:

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) 

但这种失败,因为name是不确定的。还有什么我可以做的吗?

回答

9

您可以创建context-sensitive default function

def mydefault(context): 
    return context.current_parameters.get('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) 
6

除了R-M-N的答案,如果你有一个默认为一个又一个的值,你可以写一个辅助函数来避免写很多默认功能多列。

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'))