2017-12-11 1 views
2

저는 Google App Engine, Python 2.7, Standard Environment에서 ndb 데이터 저장소를 사용하여 작업하고 있습니다. 일부 NDB 모델에 대한 업데이트를하고 있는데, 업데이트 중 하나에 "레스토랑"모델에 새 속성 (부동 소수점 숫자)을 추가해야합니다. 이 기본 값의 나의 이해는 Google App Engine NDB FloatProperty 기본값이 작동하지 않습니까?

class Restaurant(ndb.Model): 
    ... some properties ... 
    resto_fullresyncstamp = ndb.FloatProperty(default=0.0) 

했다 : 나는이 모델에 속성을 추가하는 데 필요한 한 때 과거에는, 나는 항상 같은 모델을 정의 할 때 NDB는 기본 값을 지정할 수 있습니다 얼마나 좋아했습니다 엔티티가 데이터 저장소에서 가져올 때 주어진 엔티티에 대한 resto_fullresyncstamp 특성이 없으면 하나의 값이 기본값과 함께 모델의 로컬 사본에 추가됩니다. 그런 식으로, 모든 것이 None인지 확인하기 위해 계속 체크 할 필요는 없으며 속성이 항상 내 코드에서 가치를 가질 것이라고 가정 할 수 있습니다. 그래서 ...

lastsync = ... 
resto = Restaurant.query()....get() 
if not resto: 
    logging.warning("Failed to get restauraunt: %s" % username) 
    self.error(404) 
    return 

if lastsync != 0.0 and resto.resto_fullresyncstamp > lastsync: 
    logging.warning("Requiring client to perform full resynchronization") 
    self.error(510) 
    return 

을 이런 식으로 뭔가를 할 수있을 ... 그리고 경우에도 "resto_fullresyncstamp는"내 모델의 새 속성이며, 기대하고, 특히 레스토랑은 없었으니해야 속성 집합 명시 적으로 어디에서나 비교할 유효한 (0.0) 값을 얻습니다.

Traceback (most recent call last): 
.... 
File "/base/data/home/apps/s~virt-som/1.406133528491612487/virtsom.py", line 5399, in post 
if lastsync != 0.0 and resto.resto_fullresyncstamp > lastsync: 

AttributeError: 'Restaurant' object has no attribute 'resto_fullresyncstamp' 

해서는 안이 작품 : 내가 실제로 얻고 무엇

이 오류 메시지가 무엇입니까? 저는 오래 동안 NDB와 함께 일해 왔으며, 이전에 성공적으로 모델에서 "기본"매개 변수를 사용했습니다. 내가 놓친 게 있니?

답변

0

그것이 작동하는 방식은 아닙니다.

기존 모델에 새 속성을 추가 할 때마다 해당 속성을 가져 오기 위해 이전 엔티티를 데이터 저장소에 다시 넣어야합니다. 기본값이 무엇이든 상관없이 그것을 얻으려면.

+0

잘 @janscas, 수동으로 값을 할당하여 속성을 추가하는 것은 나를 위해 문제를 분류 한 것 같지만 "기본"매개 변수의 목적은 무엇입니까? 왜 속성에 "기본"값을 제공 한 다음 개발자가 속성을 사용하기 전에 값을 수동으로 할당해야합니까? 그것은 "기본"매개 변수를 쓸모없는 것보다 더 나쁘게 만듭니다, 오도 된 것입니다. 예를 들어 [이 기사] (https://cloud.google.com/appengine/articles/update_schema)도 제가하려고하는 것과 정확히 일치합니다. –

+0

기본 매개 변수는 내용을 처리합니다. 설정하지 않으면 기본값으로 설정됩니다. 그러나 모델을 변경 한 후에 저장하는 모든 엔티티에서만 작동합니다. – janscas

+0

죄송합니다. @janscas,하지만 존경심을 가지고 [이 기사] (https://cloud.google.com/appengine/articles/update_schema)는 내가하려는 일이며, 기사에 따르면 엔티티에 새 필드를 추가 할 때 데이터 저장소에 이미 저장되어 있고이 새 필드가없는 엔티티가 있습니다. 직접 기사 인용하기 : "Datastore에서 그림을 읽을 때마다 num_votes 및 avg_rating이 채워집니다 (Datastore의 값 또는 모델에 지정된 기본값)." 이것이 내가 기대하는 바이며 최신 API 버전에서는 작동하지 않습니다. –

관련 문제