2012-04-05 8 views
8

Próbuję wczytać encję za pomocą klucza, używając identyfikatora, który został przypisany przez magazyn danych, ale nie widzę żadnej metody, aby to zrobić (używając NDB). Myślałem, że będę w stanie utworzyć klucz z identyfikatora integer i użyć key.get() do załadowania encji, ale nie widzę sposobu, aby zrobić klucz tylko z identyfikatora. Podejrzewam, że brakuje tu czegoś oczywistego. Jak powinienem załadować encję, w której tylko znam jej identyfikator?aplikacja silnika ndb - jak załadować encję za pomocą klucza, używając id?

Odpowiedz

23

YourModel.get_by_id() pobiera instancję modelu według identyfikatora.

tutaj docs:
https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_get_by_id

nie sądzę, nie można uzyskać podmiot przez ID nie znając rodzaj ponieważ przypadki różnych klas model może mieć ten sam identyfikator/KEY_NAME

+0

Dzięki, właśnie tego szukałem. Nie wiem, jak to przegapiłem w dokumentach. – user605331

+2

Myślę, że doktorzy są w błędzie, nie mogłem zmusić tego do pracy w moim życiu, ale potem zauważyłem, że przechodzę przez str, więc konwersja długich id do int zrobiła sztukę, chociaż doktorzy prowadzą cię do wierzę, że możesz użyć stritu, który nie jest prawdziwy, a przynajmniej nie w lokalnym silniku aplikacji aplikacji serwera aplikacji w wersji 1.8.9. Kiedy zrobiłem int (id_str), działało dobrze. – Shaun

+1

@Shaun Nie sądzę, że dokumenty są złe. jeśli twój id jest "int", wtedy będziesz musiał przekazać w 'int' i jeśli jest to' str', to musi to być 'str'. – aschmid00

22

Kolejnych sposób: ndb.Key(YourModel, id).get().

0

Modele w NDB nie definiują swojego typu klucza jako części modelu. Jest to fajne, ponieważ możesz mieć jeden model, który jest dostępny za pośrednictwem wielu różnych rodzajów kluczy i rodziców, co czyni je bardziej elastycznymi. Jest to jednak problematyczne, ponieważ nie zawsze jest jasne, co oznacza klucz lub skąd pochodzi.

Dlatego w przypadkach, gdy istnieje tylko kiedykolwiek jeden rodzaj klucza do danego modelu (co jest prawie każdy modelu), lubię tworzyć metody klasy do generowania tego klucza, który dodaje trochę semantycznej jasności :

class Book(ndb.Model): 
    title = ndb.StringProperty() 
    pages = ndb.IntegerProperty() 
    @classmethod 
    def make_key(cls, isbn): 
    return ndb.Key(cls, isbn) 

b = Book.make_key('1234-5678').get() 

Oczywiście dodany kod nie jest bezwzględnie potrzebny, ale dodaje przejrzystości i sprawia, że ​​moje modele są bardziej długoterminowe w utrzymaniu.

Powiązane problemy