2011-11-22 16 views
6

Actualización: Me he dado cuenta de que las entidades se guardan (y están disponibles en el Visor de Datastore) cuando las guardo usando vistas (y la función create_object). Pero cuando uso shell (manage.py shell) para crear y guardar nueva entidad, no está comprometido con el almacenamiento (pero aún se puede ver en Tes.objects.all()).Guardando entidades en django-nonrel con google appengine


empecé a jugar con el django-nonrel con google appengine y yo estoy recibiendo frustrado por algo tan simple como el ahorro de Entidades.

He configurado mi entorno como se describe en instruction. Logré ejecutar la aplicación de muestra y funciona bien. Me gustaría extenderlo para que guarde mi entidad en el almacenamiento. Para ello:

  1. añadí nuevo módulo django con models.py:

    from django.db import models 
    
    class Tes(models.Model): 
        name = models.CharField(max_length=150) 
    
  2. he creado un script para salvar algunos datos:

    import os 
    import sys 
    sys.path.append("d:\\workspace\\project\\") 
    os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' 
    from testmodule.models import Tes 
    t = Tes(name="test") 
    t.save()  
    tes = Tes.objects.all() 
    for t in tes: 
        print t.name 
    

El guión funciona sin errores. Cuando lo ejecuto varias veces, una tras otra, imprime cada vez más cadenas de "prueba". Pero cuando intento ejecutarlo después de un minuto de descanso, el Tes.objects.all() no devuelve nada. Durante ese tiempo, el archivo del almacén de datos cambia su tamaño (pero tal vez sea solo algún tipo de registro). Cuando miro el http://localhost:8000/_ah/admin/datastore, puedo seleccionar solo AhAdminXrsfToken en el campo de selección.

De todos modos, ¿qué me estoy perdiendo? ¿Dónde puedo encontrar algún tipo de registros que me digan qué pasa?

Respuesta

4

Esto es una provocación que causa mucha confusión. Desde el djangoappengine docs:

Además, nunca ejecutar manage.py runserver junto con otros de gestión comandos al mismo tiempo. Los cambios no tendrán efecto. Esa es una limitación de App Engine SDK que podría solucionarse en una versión posterior.

Así que no se puede hacer manage.py runserver y manage.py shell al mismo tiempo. Si lo hace, los cambios en el almacén de datos en uno no serán visibles en el otro. Hay un bloqueo en el almacén de datos local impuesto por el SDK de App Engine.Asegúrese de haber detenido el servidor antes de iniciar el shell.

-1

¿No debería ser t.put() si está creando una entidad en lugar de guardarla? Uso put() para crear una entidad y me funciona. Y si importa django, querrá saber que hay alternativas a django, como mi elección GAE + Jinja2 + WTForms, especialmente ahora que google.db.djangoforms está en desuso, seleccionando un marco de formularios para formularios, un motor de plantillas y tal vez un framework db y no tiene que importar django, lo que a menudo resulta en forzarlo a importar mucho más de lo que necesita.

Así que mi recomendación es evitar import django... y en su lugar utilizar Jinja2 + WTForms. Si realmente quieres django en el motor de la aplicación, entonces tal vez quieras comprobar en el proyecto www.allbuttonspressed.com que habilita todo el motor de la aplicación django para google, pero asegúrate de necesitar tanto django cuando sospeche que todo lo que necesitamos es un motor de plantillas y un marco de formulario y podemos prescindir de django.

+1

Esto realmente no responde la pregunta. –

+0

"¿Qué me estoy perdiendo?" se me preguntó y mi respuesta es la diferencia entre guardar y crear. Lo que estoy tratando de decir es que puede ser la diferencia entre guardar y crear usando save() y put() y que hay buenas alternativas para django completo. –

Cuestiones relacionadas