2014-04-22 5 views
1

가 그래서 나는이 모델이 있다고 가정 해 보자 새 필드를 점령 :GAE NDB : 추가 및 자동

class User(ndb.Model): 
    username = ndb.StringProperty(required = True) 

를 일주일 후, 몇 백 사용자 개체가 만들어집니다. 지금은 다른 필드 추가하려면 : 내가 입력에 기존 사용자 이름의 자신의 소문자 버전을 각 사용자에게 않을거야

class User(ndb.Model): 
    username = ndb.StringProperty(required = True) 
    username_lower = ndb.StringProperty() # username.lower() 

을, 그래서 어떻게 각 사용자 개체 나 자신에 대한 이러한 필드를 차지할 수 있을까?

답변

1

당신은이 작업을 수행하는, 한 번 실행하는 스크립트를 만들 수 있습니다 :

for user in User.query(): 
    user.username_lower = username.lower() 
    user.put() 
+0

@IanGSY의 답변 주셔서 감사합니다. 이것은 가장 분명한 해결책 인 것처럼 보입니다. 이렇게 많은 양의 데이터를 변경하는 GAE 협약이있을 수 있다고 생각했는데,이 방법이 실패하면 많은 데이터가 위험에 빠질 수 있습니다. 이 전에 어떤주의 사항이 있습니까? 아마도 ether는 데이터 저장소 엔티티를 내보내는 옵션입니까? – puoyaahhh

3

소문자 사용자 이름이 실제로 계산 된 속성에 사용되는 예입니다.

계산 된 속성 (ComputedProperty)는 읽기 전용이며 그 값 애플리케이션 제공 기능에 의해, 다른 특성 값으로부터 계산 된 속성. 계산 된 값은 Datastore 뷰어에서 쿼리하고 표시 할 수 있도록 Datastore에 기록되지만 데이터 저장소에서 엔터티를 으로 다시 읽을 때 저장된 값은 무시됩니다. 오히려 값이 요청 될 때마다 함수를 호출하여 값을 다시 계산합니다. 예를 들면 :

class SomeEntity(ndb.Model): 
    name = ndb.StringProperty() 
    name_lower = ndb.ComputedProperty(lambda self: self.name.lower()) 

x = SomeEntity(name='Nick') 

x.name = 'Nick' 
assert x.name_lower == 'nick' 
x.name = 'Nickie' 
assert x.name_lower == 'nickie' 
당신이 더 그것을 어쨌든 직접 이용되지 않는이, 존재하지 않는 것이 문제가되지 않는다 초기 모델 값을 저장 한 것처럼

https://developers.google.com/appengine/docs/python/ndb/properties#computed

.

관련 문제