2009-06-02 9 views
5

En una base de datos relacional clásico, que tiene la siguiente tabla:relación recursiva con Google App Engine y 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)) 

Estoy tratando de convertir esta tabla en una tabla de Google App Engine. Mi problema es con los campos MotherId y FatherId. Probé el código a continuación, pero no hay oportunidad. Python dice que no conoce el tipo de objeto Persona.

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

¿Alguien sabe cómo podemos modelar una relación recursiva en una tabla de Google App Engine? ¿Cómo podría evitar la limitación de App Engine?

ACTUALIZACIÓN Quiero expandir el problema un poco ... ¿Qué pasa si quiero agregar una colección de niños?

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

Intenté esto y no funciona. ¿Alguna idea de lo que estoy haciendo mal?

Gracias!

Respuesta

10

creo que desea SelfReferenceProperty aquí

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

Alternativamente, puede poner las relaciones de la madre y del padre en clases separadas.

+1

También tendrá que establecer la propiedad COLLECTION_NAME para evitar la 'Clase La persona ya tiene person_set propiedad' de error: madre = db.SelfReferenceProperty (COLLECTION_NAME = 'mother_set') padre = db.SelfReferenceProperty (COLLECTION_NAME =' father_set ') – robertc

+0

No sabía nada de eso. Editado, gracias :) – NicDumZ

+0

Esto es realmente genial! No sabía sobre eso. ¿Cómo podría modelar una colección de niños? hijos = db.SelfReferenceProperty (COLLECTION_NAME = 'children_set') dad.children.append (childrenOne) yo tratamos de esto y no funciona. :( – Martin