2012-05-21 5 views
3

Je suis en train de traduire une application de Datastore vers ndb et j'ai rencontré un problème dans la routine d'importation xml. Le problème est que je ne suis pas en mesure de déterminer par programme si une propriété d'une classe ndb.model est une propriété à plusieurs valeurs ou non.Comment déterminer par programme si la propriété ndb est multivaleur

Je suppose que cela est dû au manque de compétences de base de Python puisque le code que j'ai trouvé jusqu'à présent montre que la valeur est "visible". Je ne suis donc pas capable de l'attraper. S'il vous plaît aider.

from google.appengine.ext import ndb 

class House(ndb.Model): 
    name = ndb.StringProperty() 
    rooms = ndb.StringProperty(repeated=True) 

print 'Properties:' 
for p in House._properties: 
    print getattr(House,p) 

print '\nRepeated:' 
for p in House._properties: 
    print getattr(getattr(House,p),'repeated',None) 

Il en résulte les éléments suivants:

Properties: 
StringProperty('rooms', repeated=True) 
StringProperty('name') 

Repeated: 
None 
None 
+0

OK, j'ai regardé le code source et il y a un attribut dans la classe Property nommé'_'repeated 'qui est accessible. Cela fonctionne mais j'ai l'intuition que le "_" signifie qu'il n'est pas destiné à un accès extérieur. –

Répondre

8

En fait, les options de soulignement-préfixe sont l'API officielle. C'est un bug qu'ils ne sont pas documentés, je vais corriger ça. J'ai expliqué un peu plus ici: http://code.google.com/p/appengine-ndb-experiment/issues/detail?id=187

En particulier, pour obtenir les propriétés d'un modèle, vous devez utiliser House._properties, pas le code que Nick a proposé. (En fait, __dict__ peut être remplacé par des slots dans les futures versions NDB.)

+0

Merci M. Rossum qui était en train de clarifier. –

5

NDB ne propose actuellement aucune option pour introspecter modèles créés; vous devriez certainement file a bug à ce sujet. En attendant, piquer dans les internes de l'objet est la seule façon de s'y prendre. Soyez averti que c'est très fragile, car les détails internes de mise en œuvre peuvent et vont changer à tout moment.

Vous pouvez obtenir une liste des propriétés comme ceci:

properties = [(k, v) for k, v in House.__dict__.items() if isinstance(v, ndb.Property)] 

Vous pouvez déterminer si une propriété est répétée en accédant à l'attribut interne _repeated sur une instance - mais voir mon avertissement ci-dessus pour savoir pourquoi cela est probablement mauvaise idée:

House.rooms._repeated 

OU

getattr(House, 'rooms')._repeated 
+0

Merci Nick. J'ai ajouté ceci comme un [problème] (http://code.google.com/p/appengine-ndb-experiment/issues/detail?id=187) comme suggéré. –

Questions connexes