8

Mam prosty scenariusz, w którym istnieje klasa użytkownika, która ma nazwę, adres e-mail i właściwości obserwatora.Używanie ndb.KeyProperty w jaki sposób odwołać się do tego samego modelu?

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) 

Podczas wykonywania tego otrzymuję błąd.

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 - 

Każda sugestia, jak modelować atrybut "obserwujący" byłby wysoko ceniony. Dzięki z góry

Odpowiedz

29

Korzystanie z rodzaju na nieruchomości klucz e.g. some_prop = ndb.KeyProperty(User) wymusza tylko, że rodzaj klucza muszą być rodzaju Użytkownika. Więc nadal możesz korzystać z KeyProperty bez żadnego rodzaju, jeśli zajdzie taka potrzeba.

Jednakże, jeśli chcesz wymusić, że wszystkie klucze wyznawca musi być od rodzaju użytkownika (wewnątrz modelu użytkownika), a następnie otoczyć rodzaju z cytatami:

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

Jest to wyjaśnione trochę lepiej w ndb cheat sheet

+0

Perfect, @ Bert dzięki za twój wkład – ujjalcal

+0

Ten problem nie jest specyficzny dla ndb. Nie można odwoływać się do klasy według jej typu, dopóki klasa nie zostanie zdefiniowana. Dlatego ndb pozwala na użycie nazwy ciągu dla rodzaju lub obiektu typu python. –

2

Jeśli chcesz po prostu „wyznawcy” być KeyProperty następnie wystarczy umieścić:

followers = ndb.KeyProperty(repeated=True) 

lub, co myślę, że jesteś po, aby określić typ klucza.

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

Myślę, że po prostu brakuje Ci kind=User.

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

+0

Próbowałem 'kind = User', ale nie działa. Pierwszy działał jednak. Ale nadal nie bardzo jasne, dlaczego "kind = Użytkownik" lub po prostu "Użytkownik" nie będzie działać. – ujjalcal

+0

Osobiście unikam używania nazwy użytkownika jako nazwy. Ma zbyt duży potencjał do zderzenia. Zaproponuj zmianę nazwy, spróbuj ponownie. Ale używając rodzaju po prostu upewnij się, że kiedy przypisujesz klucz, jest tego szczególnego rodzaju. Możesz również umieścić nazwę modelu w cudzysłowach jako ciąg znaków, nie ma znaczenia, którego z nich użyjesz, więc spróbuj także. –

+0

dzięki za twój wkład. Masz rację, umieszczając ten rodzaj w "rozwiązuje problem. Jedną z rzeczy, których nie dostaję, jest Twój komentarz ** Osobiście unikam używania nazwy użytkownika jako nazwy. Ma zbyt duży potencjał do zderzenia ** Czy możesz wyjaśnić trochę więcej? – ujjalcal

Powiązane problemy