8

Ich habe ein einfaches Szenario, wo es eine Benutzerklasse gibt, die die Eigenschaft name, email und followers hat.Verwenden von ndb.KeyProperty, wie auf dasselbe Modell verwiesen wird?

class User(ndb.Model): 
    name = ndb.StringProperty(required = True) 
    search_name = ndb.StringProperty(required = True) 
    pw_hash = ndb.StringProperty(required = True) 
    email = ndb.StringProperty() 

    follows = ndb.KeyProperty(Follow, repeated=True) 
    followers = ndb.KeyProperty(User, repeated=True) 

Während der Ausführung bekomme ich den Fehler.

File "C:\ujjal\my project\cravel\code2\Users.py", line 46, in User 
    followers = ndb.KeyProperty(User, repeated=True) 
NameError: name 'User' is not defined 
INFO  2012-09-11 11:45:23,953 dev_appserver.py:2967] "GET/HTTP/1.1" 500 - 

Jeder Vorschlag, wie das Attribut "followers" modelliert werden würde, würde sehr geschätzt werden. Vielen Dank im Voraus

Antwort

29

eine Art auf einer Schlüsseleigenschaft Mit e.g. some_prop = ndb.KeyProperty(User) erzwingt nur, dass die Art des Schlüssels der Art Benutzers sein muss. So können Sie bei Bedarf immer noch eine KeyProperty ohne eine Art verwenden.

Wenn Sie jedoch erzwingen möchten, dass alle Folger Schlüssel Art Benutzer sein muss (im Modell Benutzer) dann umgeben die Art mit Zitaten:

followers = ndb.KeyProperty(kind='User', repeated=True) 

es ein wenig besser in der ndb cheat sheet

erklärt hat
+0

Perfekt, @Bert danke für Ihre Eingabe – ujjalcal

+0

Dieses Problem ist nicht ndb spezifisch. Sie können eine Klasse erst nach dem Definieren der Klasse anhand ihres Typs referenzieren. Aus diesem Grund können Sie in ndb einen String-Namen für eine Art oder das Python-Type-Objekt verwenden. –

2

Wenn Sie nur „Anhänger“ ein KeyProperty werden dann gerade auf:

followers = ndb.KeyProperty(repeated=True) 

oder, was ich Sie denken, sind nach der Art der Schlüssel zu spezifizieren.

follows = ndb.KeyProperty(kind=User,repeated=True) 

Ich denke, dass Sie gerade kind=User wahrscheinlich vermissen.

https://developers.google.com/appengine/docs/python/ndb/properties#types

+0

Ich versuchte 'kind = User' aber es hat nicht funktioniert. Der erste funktionierte jedoch. Aber immer noch nicht ganz klar, warum der 'kind = User' oder einfach' User' nicht funktioniert. – ujjalcal

+0

Persönlich würde ich vermeiden, Benutzer als einen Namen zu verwenden. Es hat zu viel Konfliktpotenzial. Vorschlag zum Umbenennen, erneut versuchen. Aber die Verwendung von Art stellt sicher, dass, wenn Sie einen Schlüssel zuweisen, dieser von dieser Art ist. Sie können den Namen des Modells auch in Anführungszeichen als String setzen, es spielt keine Rolle, welches Sie tatsächlich verwenden, also versuchen Sie es auch. –

+0

danke für Ihre Eingabe. Sie haben Recht, indem Sie die Art in '' das Problem lösen. Eine Sache, die ich nicht verstehe, ist dein Kommentar ** Persönlich würde ich vermeiden, Benutzer als einen Namen zu verwenden. Es hat zu viel Konfliktpotential ** Kannst du ein bisschen mehr erklären? – ujjalcal

Verwandte Themen