2016-04-12 143 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'))