2013-05-13 3 views
4

SQLAlchemy/Elixir를 사용하여 한 번만 (개체 작성시) 읽기 전용 필드를 구현해야합니다.한 번만 읽기 전용 필드

더러운 빠른 앤 솔루션 (? 예, 전 - 삽입 트리거를 사용하여)

class User(Entity): 
    # some fields ...  
    _created = Field(DateTime, default=datetime.utcnow) 
    @property 
    def created(self): 
     return self._created 

더 나은 방법이 있나요

답변

5
아마

방법이 많이 있지만, 하나는 @validates을 사용하는 것입니다 :

from sqlalchemy import * 
from sqlalchemy.orm import * 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class A(Base): 
    __tablename__ = 'a' 

    id = Column(Integer, primary_key=True) 

    readonly1 = Column(String) 
    readonly2 = Column(String) 


    @validates('readonly1', 'readonly2') 
    def _write_once(self, key, value): 
     existing = getattr(self, key) 
     if existing is not None: 
      raise ValueError("Field '%s' is write-once" % key) 
     return value 


a1 = A() 
a1.readonly1 = 'foo' 
assert a1.readonly1 == 'foo' 

try: 
    a1.readonly1 = 'bar' 
    assert False 
except ValueError, e: 
    print e 

e = create_engine("sqlite://") 
Base.metadata.create_all(e) 
s = Session(e) 
s.add(A(readonly1='foo', readonly2='bar')) 
s.commit() 

a2 = s.query(A).first() 

try: 
    a2.readonly2 = 'bar2' 
    assert False 
except ValueError, e: 
    print e 

@validates 당신이 그것을 설정하는 다른 방법을 구축하는 것을 사용할 수 attribute events를 사용하여 단지 속기이다.

+0

감사합니다. 곧 살펴 보겠습니다. – saabeilin

+0

속성 이벤트 url이 더 이상 정확하지 않습니다. +1해도 –