8

Tengo un escenario simple en el que hay una clase de usuario que tiene el nombre, el correo electrónico y la propiedad de seguidores.¿Cómo usar ndb.KeyProperty cómo hacer referencia al mismo modelo?

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) 

Al ejecutar esto recibo el error.

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 - 

Cualquier sugerencia sobre cómo modelo el atributo "seguidores" sería muy apreciada. Gracias de antemano

Respuesta

29

El uso de un tipo en una propiedad clave e.g. some_prop = ndb.KeyProperty(User) única Exige que el tipo de la clave debe ser del tipo de usuario. Por lo tanto, aún puede usar KeyProperty sin un tipo si es necesario.

Sin embargo, si desea exigir que todas las claves seguidor debe ser de usuario tipo (dentro del modelo de usuario) y luego rodear el tipo de citas:

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

Se explica un poco mejor en el ndb cheat sheet

+0

Perfecto, @Bert gracias por su entrada – ujjalcal

+0

Este problema no es ndb específico. No puede hacer referencia a una clase por su tipo hasta que se haya definido la clase. Es por eso que ndb le permite usar un nombre de cadena para un tipo o el objeto de tipo python. –

2

Si lo que desea es "seguidores" para ser un propiedadClave continuación, sólo hay que poner:

followers = ndb.KeyProperty(repeated=True) 

o, lo que cree son después, para especificar el tipo de clave.

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

Creo que solo faltan kind=User probablemente.

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

+0

Intenté 'kind = User' pero no funcionó. Sin embargo, el primero funcionó. Pero aún no está muy claro por qué el 'kind = User' o simplemente' User' no funcionará. – ujjalcal

+0

Personalmente evitaría usar el nombre del usuario. Tiene demasiado potencial para chocar. Sugerir rename, reintentar. Pero usar kind solo se asegura de que cuando asignas una clave sea de ese tipo en particular. También puede poner el nombre del modelo entre comillas como una cadena, no importa cuál sea su uso, así que intente también. –

+0

gracias por su aporte. Tienes razón, al poner el tipo '' resuelve el problema. Una cosa que no entiendo es tu comentario ** Personalmente, evitaría usar el nombre del usuario. Tiene demasiado potencial para chocar ** ¿Puedes explicar un poco más? – ujjalcal

Cuestiones relacionadas