2012-10-24 13 views
22

Quando creo un oggetto con il metodo ndb, viene creato automaticamente la chiave del tipo Chiave (tipo, id) in cui id è un numero. In tutta la documentazione mostra che è possibile utilizzare una stringa per l'id della chiave, ma non sono riuscito a scoprire come farlo automaticamente quando viene creato un oggetto.ID chiave personalizzata NDB di Google App Engine

Ho un modello Utente e stavo pensando di utilizzare il nome utente dell'utente (dal suo unico) come ID della chiave per il recupero più veloce. E 'anche una buona idea? Avrei problemi con il nome utente dato che è stato inviato dall'utente (sto convalidando l'input)?

risposta

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

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

Se questi ID sono soggetti a modifiche, questa potrebbe essere una cattiva idea. Se è il tuo sistema e puoi reagire a potenziali cambiamenti, è una buona idea, ma devi assicurarti che gli ID siano unici e relativamente stabili prima di decidere di usarli.

+0

Grazie per la risposta, ciò ha davvero senso. Pensavo fosse più complicato di così. – andrei

+0

Ho riscontrato problemi di latenza con questo approccio in precedenza. Non è una buona idea impostare manualmente gli ID per le entità Datastore, poiché si verificherà anche il problema delle "hotclip". È meglio lasciare che il datastore generi automaticamente gli ID entità e non codificare i dati nella chiave stessa. Utilizzare invece una proprietà nell'entità. Potrebbe essere allettante applicare le convenzioni del database relazionale all'archivio dati, ad esempio le chiavi primarie a incremento automatico, ma in questo modo si annulla la suddivisione dello spazio delle chiavi e si creano problemi. [1] https://cloud.google.com/appengine/articles/handling_datastore_errors –

13

Specificare l'id dell'entità al momento della creazione. Quando definisci il modello, non imposti lì un attributo id. Così, per esempio si ha:

class User(ndb.Model): 
    # fields here 

Quando si crea il modello, si ha:

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

Dal momento che il nome utente è unico e si convalidare l'input, allora non avrete alcun problema con questo approccio.

Per ulteriori informazioni su un costruttore ndb Model, è possibile dare un'occhiata a NDB Model Class - Constructor.

Spero che questo aiuti.

+1

grazie per indicare il costruttore NDB – ggauravr

0

È inoltre possibile fornire un ID intero (non necessariamente una stringa) per l'entità del modello.

class User(ndb.Model): 
... 

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