2014-02-27 2 views
1

내가 같은 모델 클래스가 유효한지 확인하는 방법 :NDB 모델

class Book(ndb.Model): 
    title = ndb.StringProperty(required=True) 
    author = ndb.StringProperty(required=True) 

을하고 나는이 사용하는 몇 가지 코드를 가지고 :

book = Book() 
    print book 
    >> Book() 
    book_key = book.put() 
    >> BadValueError: Entity has uninitialized properties: author, title 

을 모델이 유효한지 확인하는 방법이 있나요 저장하기 전에?

어떤 속성이 유효하지 않은지와 오류 유형을 알아냅니다 (예 : 필수). 그리고 구조화 된 속성이 있다면 어떻게 작동할까요?

는 기본적으로

+1

중요한 것은 중요하다면 저장하기 전에 저장해야한다고 생각합니다. 그렇지 않다면 간단히 '시도/예외'할 수 있기 때문입니다. – Lipis

+0

중복 : 귀도의 대답을보세요. http://stackoverflow.com/ questions/15200952/appengine-ndb-property-validation – voscausa

+0

@voscausa 같은 OP로 :) – Lipis

답변

0

모델은 유효 ... 모델 클래스의 적절한 검증을 수행하는 방법을 찾고,하지만 당신은 titleauthor 모두 필요하다고 지정했습니다. 따라서 여러분은 무언가를 쓸 때마다 이러한 속성 값을 제공해야합니다. 기본적으로 빈 레코드를 쓰려고합니다.

시도 :

book = Book() 
title = "Programming Google App Engine" 
author = "Dan Sanderson" 
book_key = book.put() 
2

이 접근 방식은 아래 작동하지 않습니다!
나중에 문제가 발생합니다. 나는 지금 무엇이 있었는지 기억할 수 없다.


나는 이것을하는 "공식적인"방법을 발견하지 못했습니다.

class Credentials(ndb.Model): 
    """ 
    Login credentials for a bank account. 
    """ 
    username = ndb.StringProperty(required=True) 
    password = ndb.StringProperty(required=True) 

    def __init__(self, *args, **kwds): 
     super(Credentials, self).__init__(*args, **kwds) 
     self._validate() # call my own validation here! 

    def _validate(self): 
     """ 
     Validate all properties and your own model. 
     """ 
     for name, prop in self._properties.iteritems(): 
      value = getattr(self, name, None) 
      prop._do_validate(value) 
     # Do you own validations at the model level below. 

과부하 __init__ 내 자신의 _validate 함수를 호출 : 이 내 해결 방법입니다. 각 속성에 대해 _do_validate을 호출하고 결국 모델 수준 유효성 검사를 호출합니다.

issue 177에 대해 열린 버그가 있습니다.

0

NDB가 BadValueError을 발생시킬 때 사용하는 유효성 검사 방법을 사용해 볼 수 있습니다.

book = Book() 
book._check_initialized() 

이것은 당신이 데이터 저장소에 항목을 넣을 때처럼 BadValueError을 올릴 것이다.