2012-04-18 14 views
8

Sto provando a creare un modello ndb in cui ogni record ha un "nome" di campo univoco. Vorrei definire questo campo come campo key_name e usarlo per cercare i record. Devo includere un campo nome o posso in qualche modo impostare il campo key_name su una stringa arbitraria che l'utente può specificare finché è univoca?Qual è il modo migliore per specificare un nome_chiave per il modello NDB di App Engine?

Sto pensando di utilizzare Model.get_or_insert per assicurarsi che i vecchi record non vengono sovrascritti, ma c'è un modo per dire se il valore di ritorno è appena creato o pre-esistente? Voglio essere in grado di visualizzare un messaggio di errore se l'utente ha inserito un nome duplicato.

Infine, ho provato a creare un campo key_name su un modello DjangoForms che utilizza il modello ndb sopra come metaclass in modo da poter utilizzare djangoforms per la validazione/rendering ma per qualche motivo i miei campi definiti non vengono visualizzati.

classe UserProfileForm (djangoforms.ModelForm): key_name = djangoforms.StringProperty() classe Meta: modello = ProfiloUtente

+1

Si dovrebbe davvero fare domande separate per ognuno di questi, piuttosto che raggrupparli tutti insieme. –

risposta

14

Devo includere un campo di nome o posso in qualche modo impostare il campo key_name a una stringa arbitraria che l'utente può specificare fino a quando è unica?

È possibile passare il vostro nome chiave univoca come parametro id di modellare costruttore: profile = UserProfile(id='my_unique_name').

Sto pensando di utilizzare Model.get_or_insert per assicurarmi che i vecchi record non vengano sovrascritti, ma c'è un modo per dire se il valore di ritorno è stato appena creato o preesistente? Voglio essere in grado di visualizzare un messaggio di errore se l'utente ha inserito un nome duplicato.

Usa Model.get_by_id(). Si restituirà un'istanza modello o None se un modello non viene trovato:

profile = UserProfile.get_by_id('my_unique_name') 
if profile: 
    # display error message saying that the user already exists. 

Infine, ho cercato di creare un campo key_name su un modello DjangoForms che utilizza il modello ndb sopra come il metaclasse modo da poter utilizzare djangoforms per validazione/rendering ma per qualche ragione i miei campi definiti non vengono visualizzati.

Non so come funzionano DjangoForms, ma molto probabilmente non sono compatibili con NDB. Dovrai creare la tua logica di convalida.

+1

La soluzione per la parte 2 non funzionerà se desidera creare l'utente in modo transazionale se non esiste già - per questo è necessaria una transazione. –

+0

@NickJohnson cosa suggeriresti? Per sovrascrivere 'Model.get_or_insert()' e sollevare un'eccezione all'interno della transazione se ottieni la parte restituisce l'utente? – Maxim

+1

Suggerirei di implementare una transazione che faccia esattamente ciò che è necessario: tentare di ottenere il modello; genera un errore se esiste e crea se non lo fa. –

Problemi correlati