2016-04-12 15 views
6

Tôi đang cố gắng viết một lớp cho các chất có tên được gửi (cho tên, như thường được sử dụng trong phòng thí nghiệm) và cột khác cho tên dài (trong trường hợp tên thực sự không đầy đủ). Có một số wy để nói với lớp học chỉ cần sao chép giá trị của trường tên vào trường tên dài trong trường hợp một tên dài không được chỉ định?SQLAlchemy đặt giá trị mặc định của một cột thành cột khác

tôi đã cố gắng một cái gì đó như thế này:

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) 

Nhưng điều này không, vì name là undefined. Tôi có thể làm gì khác không?

Trả lời

9

Bạn có thể tạo 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

Ngoài câu trả lời của r-m-n nếu bạn có nhiều hơn một cột mặc định là giá trị của nhau, bạn có thể viết một hàm helper để tránh phải viết nhiều chức năng mặc định.

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')) 
Các vấn đề liên quan