2012-04-18 11 views
8

Estoy tratando de crear un modelo ndb donde cada registro tenga un campo único "nombre". Me gustaría definir este campo como el campo key_name y usarlo para buscar los registros. ¿Debo incluir un campo de nombre o puedo establecer de alguna manera el campo key_name en una cadena arbitraria que el usuario puede especificar siempre que sea único?¿Cuál es la mejor manera de especificar un key_name para el modelo NDB de App Engine?

Estoy pensando en usar Model.get_or_insert para asegurarme de que los registros antiguos no se sobrescriban, pero ¿hay alguna manera de saber si el valor devuelto es nuevo o está preexistente? Quiero poder mostrar un mensaje de error si el usuario ingresó un nombre duplicado.

Por último, traté de crear un campo key_name en un modelo DjangoForms que utiliza el modelo ndb anterior como la metaclase, así que puedo usar djangoforms para la validación/representación pero por alguna razón mis campos definidos no aparecen.

clase UserProfileForm (djangoforms.ModelForm): nombre_tecla = djangoforms.StringProperty() Meta clase: modelo = PerfilUsuario

+1

En realidad, debería hacer preguntas separadas para cada una de estas, en lugar de agruparlas todas juntas. –

Respuesta

14

¿Tengo que incluir un campo de nombre o ¿hay algún modo establecer el campo nombre_tecla a una cadena arbitraria que el usuario puede especificar, siempre que sea única

Usted puede pasar su nombre de su clave única como el parámetro id para modelar constructor: profile = UserProfile(id='my_unique_name').

Estoy pensando en usar Model.get_or_insert para asegurarme de que no se sobrescriban los registros antiguos, pero ¿hay alguna forma de saber si el valor devuelto es nuevo o preexistente? Quiero poder mostrar un mensaje de error si el usuario ingresó un nombre duplicado.

Use Model.get_by_id(). Se devolverá una instancia de modelo o None si no se encuentra un modelo:

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

Por último, he tratado de crear un campo nombre_tecla en un modelo DjangoForms que utiliza el modelo NDB anteriormente como el metaclase para que pueda utilizar djangoforms para validación/representación, pero por alguna razón mis campos definidos no aparecen.

No sé cómo funcionan los DjangoForms, pero lo más probable es que no sean compatibles con NDB. Querrá crear su propia lógica de validación.

+1

Su solución para la parte 2 no funcionará si desea crear el usuario transaccionalmente si aún no existe, se requiere una transacción para eso. –

+0

@NickJohnson, ¿qué sugieres? Para anular 'Model.get_or_insert()' y para generar una excepción dentro de la transacción si get part returns user? – Maxim

+1

Sugiero implementar una transacción que haga exactamente lo que se necesita: intentar obtener el modelo; lanzar un error si existe, y crearlo si no existe. –

Cuestiones relacionadas