3

J'ai les 2 modèles ci-dessous NDBune seule référence Google datastore fois dans un autre genre de multiples sorte avec NDB

from endpoints_proto_datastore.ndb import EndpointsModel 

class Foo(EndpointsModel): 
    attr1 = ndb.StringProperty(required=True) 

class Bar(EndpointsModel): 
    attr1 = ndb.KeyProperty('Foo', required=True) 
    attr2 = ndb.KeyProperty('Foo', required=True) 

Comme vous le voyez Bar a quelques références à Foo. Maintenant, quand j'affecte des valeurs à chacune des références, la seconde remplace la première et seulement elle est stockée à la base de données et la partie la plus drôle est que lorsque recherché avec la visionneuse de banque de données dev_appserver, la propriété est sous le nom 'Foo', pas sous le nom de la deuxième propriété, qui a remplacé le premier.

Après insérer ce que j'attends

Bar(key=Key('Bar', xxxxxxxxxxxxxxxx), attr1=Key('Foo', xxxxxxxxxxxxxxxx), attr2=Key('Foo', xxxxxxxxxxxxxxxx) 

mais je ne reçois

Bar(key=Key('Bar', xxxxxxxxxxxxxxxxxx), attr2=Key('Foo', xxxxxxxxxxxxxxxx)) 

Et le spectateur datastore,

Entity Kind Bar 

Entity Key xxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 

ID   xxxxxxxxxxxxxxxx 


Foo (Key) xxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 

Foo: id=xxxxxxxxxxxxxxxx 
+1

Je viens de tester cela et obtenu les mêmes résultats. Aucune idée pourquoi: \ – Kris

+0

@Kris au moins j'ai de la compagnie :) –

Répondre

3

Le premier argument de KeyProperty est le nom de la propriété (si vous souhaitez que le nom soit différent de la propriété de classe), utiliser deux fois le même nom découvrir le comportement que vous voyez.

Vous devez utiliser un argument nommé au lieu de préciser le genre:

ndb.KeyProperty(kind='Foo', required=True)