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

2024-05-12 20:11:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图为物质写一个类,它有一个名字归档(在实验室里通常使用的名称)和另一个长名称列(以防名称实际上不完整)。如果没有指定长名称,是否有一些wy告诉类只将name字段的值复制到long 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=name)

但是这失败了,因为name是未定义的。我还能做些什么吗?在


Tags: 方法name名称truebasestringcolumn名字
2条回答

除了r-m-n的答案,如果有多个列默认为另一列的值,则可以编写一个helper函数来避免编写许多默认函数。在

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

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

相关问题 更多 >