2009-06-02 11 views
5

Dans une base de données relationnelle classique, j'ai le tableau suivant:récursive Relations avec Google App Engine et 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)) 

Je suis en train de convertir cette table dans une table de Google App Engine. Mon problème est avec les champs MotherId et FatherId. J'ai essayé le code ci-dessous, mais aucune chance. Python dit qu'il ne connaît pas le type d'objet Personne.

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

Est-ce que quelqu'un sait comment modéliser une relation récursive dans une table Google App Engine? Comment pourrais-je contourner la limitation d'App Engine? Je veux élargir un peu le problème ... Et si je voulais ajouter une collection d'enfants?

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

J'ai essayé ceci et cela ne fonctionne pas. Une idée de ce que je fais mal?

Merci!

Répondre

10

Je pense que vous voulez SelfReferenceProperty ici

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

Vous pouvez mettre les relations mère et son père dans des classes séparées.

+1

Vous aurez également besoin de définir la propriété nom_collection pour éviter l'erreur « Personne de classe a déjà propriété person_set »: mère = db.SelfReferenceProperty (nom_collection = « mother_set ») père = db.SelfReferenceProperty (nom_collection = » father_set ') – robertc

+0

Je ne savais pas à ce sujet. Édité, merci :) – NicDumZ

+0

C'est vraiment cool! Je ne savais pas à ce sujet. Comment pourrais-je modéliser une collection d'enfants? enfants = db.SelfReferenceProperty (nom_collection = 'children_set') dad.children.append (childrenOne) J'ai essayé et il ne fonctionne pas. :( – Martin