使用google appengine在django-nonrel中保存实体

时间:2011-11-22 12:26:32

标签: python google-app-engine django-nonrel

更新:我注意到当我使用视图(和create_object函数)保存实体时,实体已保存(并在数据存储区查看器中可用)。但是当我使用shell(manage.py shell)创建并保存新实体时,它不会被提交到存储(但仍可以在Tes.objects.all()中看到。)


我开始玩带有google appengine的django-nonrel,我对拯救实体这样简单的事感到沮丧。

我按照instruction中的说明设置了我的环境。我设法运行示例应用程序,它运行正常。我想扩展它,以便将我的实体保存到存储中。为此:

  1. 我在models.py中添加了新的django模块:

    from django.db import models
    
    class Tes(models.Model):
        name = models.CharField(max_length=150)
    
  2. 我创建了一个脚本来保存一些数据:

    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
    
  3. 脚本运行时没有错误。当我一个接一个地运行它几次时,它会打印越来越多的“测试”字符串。但是当我尝试在一分钟后运行它时, Tes.objects.all()什么都不返回。在此期间,数据存储文件会改变它的大小(但可能只是某种日志)。当我查看http://localhost:8000/_ah/admin/datastore时,我只能从选择字段中选择 AhAdminXrsfToken

    无论如何,我错过了什么?在哪里我可以找到某种日志来告诉我什么是错的?

2 个答案:

答案 0 :(得分:4)

这是一个引起很多困惑的问题。来自djangoappengine docs

  

此外,永远不要与其他管理一起运行manage.py runserver   命令同时。更改不会生效。那是一个   App Engine SDK限制可能会在以后的版本中得到修复。

因此,您无法同时执行manage.py runservermanage.py shell。如果这样做,则对其中一个数据存储区的更改将不可见。 App Engine SDK强制执行本地数据存储区锁定。确保在启动shell之前已停止服务器。

答案 1 :(得分:-1)

如果你创建一个实体而不是保存它,那么它不是t.put()吗?我使用put()创建一个实体,它适用于我。如果你导入django,你可能想知道django还有其他选择,例如我选择GAE + Jinja2 + WTForms,特别是现在不推荐使用google.db.djangoforms选择表单框架,模板引擎和db框架并且您不必导入django,这通常会导致您导入的内容远远超出您的需要。

所以我的建议是避免import django...而是使用Jinja2 + WTForms。如果你真的想在app引擎上使用django那么你可能想要检查项目www.allbuttonspressed.com,该项目启用所有django for google app引擎但是当我怀疑我们需要的是模板引擎时,请确保你需要这么多django一个表单框架,我们可以不用django。