2016-04-12 42 views
6

Sto provando a scrivere una classe per le sostanze con un nome archiviato (per il nome, come comunemente utilizzato in laboratorio) e un'altra colonna per il nome lungo (in caso il nome è in realtà incompleto). C'è qualche cosa da dire alla classe di copiare semplicemente il valore del campo del nome nel campo del nome lungo nel caso in cui non sia specificato un nome lungo?SQLAlchemy imposta il valore predefinito di una colonna a quella di un'altra colonna

Ho provato qualcosa di simile:

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) 

Ma questo non riesce, poiché name è indefinito. C'è qualcos'altro che potrei fare?

risposta

9

È possibile creare 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

Oltre alla risposta di r-m-n se si dispone di più di una colonna che il default è il valore di un altro, è possibile scrivere una funzione di supporto per evitare di scrivere molte funzioni predefinite.

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