2012-05-21 3 views
3

Google 애플리케이션 엔진과 Python에서 NDB를 사용하여이 오류가 발생했습니다. StructuredProperty를 반복 할 수 없습니다. 자체 속성을 반복하지 않았습니다.중첩 반복 구조화 된 속성을 가진 GAE 반복 구조화 된 속성

빈 문자를 새로 만드는 과정에서 오류가 발생하여 생성 후 속성을 채울 수 있기 때문에 "없음"입니다.

나는 내 엔티티 "Character"에 반복적이며 구조화 된 속성을 포함하고있는 또 다른 엔티티 "Weapon"을 포함하는 반복되고 구조화 된 "weaponList"속성을 원한다고 추측하고 있습니다. 엔티티 "저주".

스티브 허프만 (Steve Huffman)과 함께 Udacity의 cs253에서 제 5 번째 주에 있었기 때문에 나는 위험 할 정도로 충분히 알고있는 것 같아서, 이것이 문제라는 것을 확신하고, 더 나은 해결책을 얻었습니다. 목표.

기본적으로 GM & 플레이어 실시간 메시징 및 캐릭터 시트 업데이트 기능이있는 Dungeons and Dragons-ish 캐릭터 관리 시스템을 만들고 있습니다. 점점 더 많은 Google + 행 아웃 RPG 플레이어에게 유용 할 것이라고 생각합니다. . 나는 무기, 아이템, 저주 및 마법 효과의 목록을 모두 별도의 개체로 가지고 있기 때문에 자유롭게 혼합하고 일치시킬 수 있습니다.

무기 및 아이템은 여러 가지 저주 또는 훌륭한 마법 효과를 가질 수 있습니다. 캐릭터는 임의의 개수의 무기를 가질 수 있으며, yadda yadda. 처음에는 엔티티 키 목록을 저장하는 것이 길 일 것이라고 생각했습니다. 그렇다면 데이터베이스에서 각 무기를 개별적으로 가져와 각각의 무기에 대한 각 저주를해야한다고 생각했습니다 ... 비효율적 인 방법으로 보였습니다.

게다가 플레이어와 GM은 사물을 사용자 정의하는 것을 좋아하지만 이는 그렇게하지 않습니다. 그래서, 그것은 나를 때렸다, 나는 하나의 테이블에 표준 물건 목록을 가질 수 있고, 캐릭터에 "추가"하면 반복되는 구조화 된 속성에서 그 캐릭터에게 특별히 복사된다. 그리고 지옥을 사용자 정의 할 수있다. 다른 사람에게 아무런 영향을 미치지 않고, 또는 여분의 일을하지 않고도.

하지만 작동하지 않으므로 결과적으로 목록에있는 목록에서 결코 끝나지 않는 목록 때문에 결코 허용되지 않는다고 생각합니다. 더 좋은 방법이 뭔가요?

답변

3

내 동료 newbs에 대한 내 자신의 질문에 대답하십시오. 짧은 대답 - LocalStructureProperty를 사용하십시오. 내 이론은 중첩 된 목록에 대한 색인 생성 (Google이 자동으로 수행)이 어리석은 일이라는 것입니다. 이 문서는 실제로 적어도 내 독서에서, 또는 그것을 지정할 수 없습니다 그리고 난 그냥 "그것을"충분히 모릅니다. 그러나 LocalStructuredProperties는 인덱스를 만들지 않으며 현재 설치가 정상적으로 작동합니다. 목록 형식으로 데이터베이스 개체의 로컬 복사본 (참조 아님)을 필요로하는 경우 (로컬 목록도 속성으로 포함) localStructuredProperty가 필요할 수 있습니다.

내가 좀 더 자세하게를 통해 가고 싶은, 내 모델 수업 전에 내가 표준 데이터 저장소를 사용하여 시도 옵션의 부부, 그리고 NDB의 JSON 속성 데이터 형식

같은 것을 보았다
class Character(ndb.Model): 
    name = stringProperty() 
    weaponList = StructuredProperty(WeaponModel.Weapon, repeated=True) 

class WeaponModel(ndb.Model): 
    name = stringProperty() 
    curseList = StructuredProperty(BufferModel.Curse, repeated=True) 

class BufferModel(ndb.Model): 
    name = stringProperty() 

위에서 언급 한 오류가 다시 나타납니다. StructuredProperty를 반복 할 수 없습니다. 자체의 반복 속성이 없습니다.

가능한 해결책을 설문 조사하기로 결정했습니다.이 알 수 있도록

1) 나는

weaponList = ListProperty (WeaponModel.Weapon) // 여기에서 데이터 유형을 통과해야합니다 기본 데이터 저장소 DB (안 NDB)로 전환하고 목록 속성에 모든 변경 무엇 그것은 저장 될 것입니다

목록 속성은 알려진 데이터 스토어 유형 (키, 문자열, 정수)의 목록 만 허용하므로 내 모델 엔티티 저장은 작동하지 않습니다. 키 목록을 저장하는 것이 좋습니다.

weaponList = ListProperty (db.key는)

이 적절하게 작동합니다. 사용자가 자신의 무기를 편집하거나 만들 수 있도록 무기에 작성자 속성을 추가 한 다음 공개 또는 비공개와 같은 다른 참조를 기반으로 쿼리를 생성 할 수 있습니다.

정말 그런 생각이 들지 않았습니다. 어떤 이유로 든 스파게티 괴물의 비젼이 계속 내 머리 속으로 들어 왔기 때문에 NDB의이 json object guy은 어떨까요?

그 일을 건물의 대부분은 의사 코드 버전과 같습니다

aCurse = getcurse 
aJsonCurse = json.dump(aCurse) 
aWeapon = getWeapon(curseList=[aJsonCurse]) 
aJsonWeapon = json.dump(aWeapon) 


aCharacter.weaponList = [aJsonWeapon] 

하지만 쉽게 그 일을하지 않았다. 그전에는 json 객체가있는 무기가 json으로 넘겨 졌기 때문에 중첩 된 json으로 무기를 버리는 것은 그리 좋지 않았습니다. 나는 물건을 다르게 지으면서 그것 주위에 일했다. 그러나 스파게티 괴물은왔다. 그리고 웃기 시작했다. 그래서 나는 멈 췄고, 점심에 갔다.

내가 돌아 왔을 때 나는 문서를 다시 볼 것이라고 생각했다. 구조화와 LocalStructured 간의 유일한 차이점은 색인 생성이 부족하여 도움이되지 않는 것 같았지만 어쨌든 나는 그것을 제공 할 것이라고 생각했습니다. 글쎄, 나는 오류가 아니므로 필요에 따라 엔티티를 검색 할 수 있습니다. 누가 위험을 미리 알고 있는지 알 수 있습니다.

바라건대 이것은 맹인을 올바른 방향으로 향하게하기를 바랍니다.

6

구조적 특성에 대한 documentation 명확하게 진술하십시오 StructuredProperty 반복 할 수 있고, StructuredProperty 다른 StructuredProperty를 포함 할 수 있지만

이 조심 : 하나 개 structred 속성은 단지 그들 중 하나는 반복 될 수있는 또 다른 포함 경우. 해결 방법은 LocalStructuredProperty을 사용하는 것입니다.이 제약 조건은 없지만 속성 값에 대한 쿼리는 허용하지 않습니다.

관련 문제