2016-04-12 8 views
6

名前のフィールド(名前の場合はラボでよく使われる)と長い名前の別の列を持つ物質のクラスを作成しようとしています。名前が実際に不完全な場合)。ロングネームが指定されていない場合に、ロングネームフィールドに名前フィールドの値をコピーするようにクラスに指示することがありますか? nameが未定義であることから、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) 

しかし、これは失敗します。

私はこのような何かを試してみました。私にできることはほかにありますか?

答えて

9

あなたは別の1の値にデフォルトは、あなたは多くのデフォルトの関数を記述避けるために、ヘルパー関数を書くことができます複数の列がある場合は、R-M-Nの答えに加えて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

を作成することができます。

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')) 
関連する問題