2012-06-29 3 views
2

데이터를 유효화하고 모델에 데이터를 전달하는 Form 객체를 사용하는 많은 앱이 있지만 모델에는 절대 유효성 검사를하지 않습니다. 문맥에 관계없이 모델 유효성 검사 (예 : 18 세 미만의 사용자 없음)에 코어 유효성 검사를 실행하는 것이 더 좋습니다. 즉, 웹 UI 또는 명령 행을 통해 사용자를 작성하는 방법에 상관하지 않으며 핵심 규칙이 항상 적용되어야합니다.SQLAlchemy를 사용하여 모델에 양식 유효성 검사를 적용하는 방법은 무엇입니까?

필자는 Pyramid 응용 프로그램에서 SQLAlchemy를 사용하고 있으며, 내 양식 (WTForms)이 모델에 정의 된 핵심 규칙을 항상 존중하는 방식으로 모델에서 핵심 유효성 검사 규칙을 정의하고 싶습니다. 데이터 일관성.

다른 사람이 이미이 작업을 수행하고 있습니까?

this php과 비슷한 것.

+0

모델 클래스 자체에서 모델에 사용중인 get/put/save/create 메소드를 오버라이드 할 수 없습니다. (항상 우선해야하기 때문에) 'super'를 사용하여 실제 생성/업데이트를 수행하십시오. 시험을 통과하면? –

+1

모델에 유효성 검사를 넣지 않는 것이 좋은 이유 중 하나는 다른 형식을 가질 수 있다는 것입니다. 한 가지 재미있는 예는 불완전한 모델을 저장하는 것입니다. 불완전한 모델을 저장하려고하면 모델 유효성 검사가 실패하지만 양식에 유효성 검사가있는 경우. 한 가지 양식이 실패하거나 통과 할 수 있지만 최종 결과는 항상 유효합니다. 모델에서 유효성 검사를하면 조건부 유효성 검사와 같은 추악한 작업을 수행하게됩니다 ... 모델에는 논리가 포함되어서는 안됩니다. –

+0

@ LoïcFaure-Lacroix 아주 좋은 지적이지만, 불완전하고 손상된 모델을 저장하지 못하게하는 핵심 규칙 만 고려하고 있습니다. 예를 들어, "데이터베이스의 모든 사용자는 유효한 연령이어야하며 예외가 없어야합니다". 이 중요성을 지닌 규칙이 모델에 있어야하며 마치면 방어의 마지막 장벽으로 작용해야합니다. – BDuelz

답변

2

SQLAlchemy를 사용하면 특정 이벤트가 발생할 때 호출되는 리스너를 등록 할 수 있습니다. 예를 들어 모델의 필드가 수정 될 때 트리거되는 이벤트를 등록 할 수 있습니다. SQLAlchemy documentation에서 : RETVAL = TRUE 플래그가() 듣고 전달 될 때

리스너의 값의 가능성이 수정 된 버전을 반환 할 수있는 옵션이 있습니다 :

def validate_phone(target, value, oldvalue, initiator): 
    "Strip non-numeric characters from a phone number" 

    return re.sub(r'(?![0-9])', '', value) 

# setup listener on UserContact.phone attribute, instructing 
# it to use the return value 
listen(UserContact.phone, 'set', validate_phone, retval=True) 

위의 같은 검증 기능 또한 과 같은 예외를 발생시켜 작업을 중지하려면 ValueError으로 올릴 수 있습니다.

따라서 모델 수준에서 특정 필드의 값을 수정하거나 거부 할 수 있습니다.

양식 라이브러리가이 기능과 통합되어 있는지 확실하지 않지만 고유 한 솔루션을 구르는 것은 어렵지 않습니다.

+2

[@validates] (http://docs.sqlalchemy.org/en/rel_0_9/orm/mapper_config.html#simple-validators)는 어떻게됩니까? – Zitrax

+0

@Zitrak : 링크가 변경되었습니다. 이제 http://docs.sqlalchemy.org/en/rel_0_9/orm/mapped_attributes.html#simple-validators입니다. – runejuhl

관련 문제