SQLAlchemy将一列的默认值设置为另一列的默认值

时间:2016-04-12 16:44:22

标签: python class 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未定义。还有什么我可以做的吗?

2 个答案:

答案 0 :(得分:15)

您可以创建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)

答案 1 :(得分:9)

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