2012-10-24 12 views
22

Gdy utworzę obiekt z metodą ndb, automatycznie tworzy klucz typu Klucz (rodzaj, identyfikator), gdzie id jest liczbą. W całej dokumentacji pokazuje, że możesz użyć łańcucha do identyfikatora klucza, ale nie mogłem dowiedzieć się, jak to zrobić automatycznie po utworzeniu obiektu.Google App Engine NDB klucz niestandardowy id

Mam model użytkownika i myślałem, że użyję nazwy użytkownika użytkownika (ponieważ jest unikalny) jako identyfikatora klucza do szybszego pobierania. Czy to nawet dobry pomysł? Czy miałbym problemy z nazwą użytkownika, ponieważ jest on przesłany przez użytkownika (sprawdzam poprawność danych wejściowych)?

Odpowiedz

30
class UserModel(ndb.Model): 
    ... 

user_model_entity = UserModel(id='some_string', ...) 

Jeśli te identyfikatory mogą ulec zmianie, może to być zły pomysł. Jeśli to twój własny system i możesz zareagować na potencjalne zmiany, to świetny pomysł, ale musisz się upewnić, że identyfikatory będą unikalne i względnie stabilne, zanim zdecydujesz się na ich użycie.

+0

Dzięki za odpowiedź, to ma sens. Myślałem, że to bardziej skomplikowane. – andrei

+0

Wystąpił problem opóźnień z tym podejściem wcześniej. Nie jest dobrym pomysłem ręczne ustawienie identyfikatorów dla obiektów Datastore, ponieważ napotkasz również problem "gorących tabletów". Najlepiej jest pozwolić automatycznym generowaniu identyfikatorów jednostek magazynu danych i nie kodować danych do samego klucza. Zamiast tego użyj właściwości w encji. Może to być kuszące do stosowania relacyjnych baz danych w Datastore, takich jak automatycznie zwiększające się klucze podstawowe, ale to faktycznie cofnie odfiltrowanie obszaru kluczy i spowoduje problemy. [1] https://cloud.google.com/appengine/articles/handling_datastore_errors –

13

Podajesz identyfikator jednostki w momencie jej utworzenia. Po zdefiniowaniu modelu nie ustawia się tam atrybutu identyfikatora. Tak więc, na przykład masz:

class User(ndb.Model): 
    # fields here 

Podczas tworzenia modelu, trzeba:

user = User(id='username', ...) 

Ponieważ nazwa jest unikalna i sprawdzić poprawność wprowadzonych danych, to nie będzie miał żadnych problemów z tym podejście.

Aby uzyskać więcej informacji na temat konstruktora ndb Model, można spojrzeć na NDB Model Class - Constructor.

Mam nadzieję, że to pomoże.

+1

dzięki za skierowanie do konstruktora NDB – ggauravr

0

Można również podać liczbę całkowitą (niekoniecznie ciąg) dla jednostki modelu.

class User(ndb.Model): 
... 

user = User(id=1234567890, ...) 
user.put()