2012-04-05 14 views
8

Sto provando a caricare un'entità per chiave utilizzando l'id che è stato assegnato dal datastore ma non vedo alcun metodo API per farlo (usando NDB). Ho pensato che sarei in grado di creare una chiave da un ID intero e utilizzare key.get() per caricare l'entità, ma non vedo un modo per creare una chiave solo da un ID. Sospetto che mi manchi qualcosa di ovvio qui. Come dovrei caricare un'entità dove conosco solo l'id di esso?motore app ndb - come caricare entità per chiave usando id?

risposta

23

YourModel.get_by_id() ottiene un'istanza di modello da id.

qui la documentazione:
https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_get_by_id

non credo che non si può ottenere un'entità da id senza conoscere il genere perché le istanze di diverse classi del modello possono avere lo stesso id/key_name

+0

Grazie, è esattamente quello che stavo cercando. Non so come mi sia perso nei documenti. – user605331

+2

Penso che i documenti siano sbagliati, non sono riuscito a far funzionare tutto questo per la vita di me, ma poi ho notato che stavo passando uno str, quindi convertire il long ID in un int ha fatto il trucco, anche se i documenti ti portano a credete di poter usare uno str questo non è vero almeno per quanto riguarda la versione 1.8.9 del motore app dell'app dev dev locale. Una volta che ho fatto un int (id_str) ha funzionato bene. – Shaun

+1

@Shaun non penso che i documenti siano sbagliati. se il tuo id è un 'int' allora dovrai passare in un' int' e se è un 'str' allora deve essere un' str'. – aschmid00

22

altro modo: ndb.Key(YourModel, id).get().

0

I modelli in NDB non definiscono il tipo di chiave come parte del modello. Questo è elegante in quanto è possibile avere un determinato tipo di modello accessibile attraverso diversi tipi di chiavi e genitori, il che li rende più flessibili. Ma è un po 'problematico perché non è sempre chiaro cosa rappresenta la chiave o da dove proviene.

Quindi, nei casi in cui ci sia sempre e solo uno sorta di chiave per un determinato modello (che è quasi ogni modello), mi piace creare un metodo di classe per la generazione di quella chiave, che aggiunge un po 'di chiarezza semantica :

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() 

che il codice inserito non è strettamente necessario, ma aggiunge chiarezza e rende i miei modelli più mantenibile a lungo termine.

Problemi correlati