Используя ndb.KeyProperty, как ссылаться на ту же модель?

У меня есть простой сценарий, в котором есть класс User, который имеет свойство имени, электронной почты и подписчиков.

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)

При выполнении этого я получаю сообщение об ошибке.

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 -

Любое предложение относительно того, как смоделировать атрибут «последователи», будет высоко оценено. Заранее спасибо


person ujjalcal    schedule 11.09.2012    source источник


Ответы (2)


Использование типа в свойстве ключа e.g. some_prop = ndb.KeyProperty(User) обеспечивает только то, что тип ключа должен быть типом User. Таким образом, вы все равно можете использовать KeyProperty без вида, если это необходимо.

Однако, если вы хотите обеспечить, чтобы все последующие ключи были типа User (внутри модели User), тогда заключите тип в кавычки:

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

Немного лучше это объясняется в шпаргалке ndb.

person Rob Curtis    schedule 11.09.2012
comment
Эта проблема не специфична для ndb. Вы не можете ссылаться на класс по его типу до тех пор, пока класс не будет определен. Вот почему ndb позволяет вам использовать строковое имя для вида или объекта типа python. - person Josh J; 30.04.2015

Если вы просто хотите, чтобы «последователи» были KeyProperty, просто введите:

followers = ndb.KeyProperty(repeated=True)

или, что, я думаю, вам нужно, указать тип ключа.

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

Я думаю, вам просто не хватает kind=User вероятно.

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

person Paul Collingwood    schedule 11.09.2012
comment
Я пробовал kind=User, но это не сработало. Хотя первый работал. Но все равно не очень понятно, почему kind=User или просто User не работает. - person ujjalcal; 11.09.2012
comment
Лично я бы не стал использовать User в качестве имени. У него слишком большой потенциал для столкновения. Предложите переименовать, повторите попытку. Но использование вида просто гарантирует, что когда вы назначаете ключ, он принадлежит к этому конкретному типу. Вы также можете поместить название модели в кавычки в виде строки, не имеет значения, что вы используете на самом деле, так что попробуйте и это. - person Paul Collingwood; 11.09.2012
comment
Спасибо за ваш вклад. Вы правы, поставив вид в '', решает проблему. Чего я не понимаю, так это вашего комментария. Лично я бы избегал использования имени пользователя в качестве имени. У него слишком большой потенциал для конфликта Не могли бы вы объяснить немного больше? - person ujjalcal; 11.09.2012
comment
Я просто имел в виду, что если вы когда-нибудь (например) начнете использовать службу пользователей, вы можете сказать: user = users.User([email protected]) и в db/ndb также есть свойство UserProperty. Таким образом, наличие собственного класса с именем User не поможет отделить их всех ни в коде, ни в вашем уме. Это просто мои личные предпочтения. - person Paul Collingwood; 11.09.2012
comment
понял и согласен с вами использовать UserProperty/users.User(...) будет лучшим подходом. Я проверю это, спасибо за участие - person ujjalcal; 11.09.2012