2009-06-02 9 views
5

W klasycznym relacyjnej bazy danych mam poniższej tabeli:Recursive związku z Google App Engine i BigTable

CREATE TABLE Person(
    Id int IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    MotherId int NOT NULL REFERENCES Person(Id), 
    FatherId int NOT NULL REFERENCES Person(Id), 
    FirstName nvarchar(255)) 

próbuję przekonwertować tę tabelę w tabeli Google App Engine. Mój problem dotyczy pól MotherId i FatherId. Próbowałem kodu poniżej, ale nie ma szans. Python mówi, że nie zna obiektu typu Person.

class Person(db.Model): 
    mother = db.ReferenceProperty(Person) 
    father = db.ReferenceProperty(Person) 
    firstName = db.StringProperty() 

Czy ktoś wie w jaki sposób możemy modelować rekurencyjną relacji w tabeli Google App Engine? Jak mogę obejść ograniczenia App Engine?

AKTUALIZACJA Chcę nieco rozszerzyć problem ... Co zrobić, jeśli chcę dodać kolekcję dzieci?

children = db.SelfReferenceProperty(collection_name='children_set') 
dad.children.append(childrenOne) 

Próbowałem tego i to nie działa. Każdy pomysł, co robię źle?

Dzięki!

Odpowiedz

10

myślę, że chcesz SelfReferenceProperty tutaj

class Person(db.Model): 
    mother = db.SelfReferenceProperty(collection_name='mother_set') 
    father = db.SelfReferenceProperty(collection_name='father_set') 
    firstName = db.StringProperty() 

Alternatywnie, można umieścić relacji matka i ojciec w oddzielnych klasach.

+1

Będziesz również trzeba ustawić właściwość COLLECTION_NAME aby uniknąć 'Klasa osoba ma już właściwość person_set' błąd: matkę = db.SelfReferenceProperty (nazwa_zbioru = 'mother_set') ojciec = db.SelfReferenceProperty (nazwa_zbioru =” father_set ') – robertc

+0

Nie wiedziałem o tym. Edytowane, dzięki :) – NicDumZ

+0

To jest naprawdę fajne! Nie wiedziałem o tym. Jak mogę modelować kolekcję dzieci? dzieci = db.SelfReferenceProperty (nazwa_zbioru = 'children_set') dad.children.append (childrenOne) Próbowałem to i to nie działa. :( – Martin