更新:我注意到当我使用视图(和create_object函数)保存实体时,实体已保存(并在数据存储区查看器中可用)。但是当我使用shell(manage.py shell)创建并保存新实体时,它不会被提交到存储(但仍可以在Tes.objects.all()中看到。)
我开始玩带有google appengine的django-nonrel,我对拯救实体这样简单的事感到沮丧。
我按照instruction中的说明设置了我的环境。我设法运行示例应用程序,它运行正常。我想扩展它,以便将我的实体保存到存储中。为此:
我在models.py中添加了新的django模块:
from django.db import models
class Tes(models.Model):
name = models.CharField(max_length=150)
我创建了一个脚本来保存一些数据:
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
脚本运行时没有错误。当我一个接一个地运行它几次时,它会打印越来越多的“测试”字符串。但是当我尝试在一分钟后运行它时, Tes.objects.all()什么都不返回。在此期间,数据存储文件会改变它的大小(但可能只是某种日志)。当我查看http://localhost:8000/_ah/admin/datastore时,我只能从选择字段中选择 AhAdminXrsfToken 。
无论如何,我错过了什么?在哪里我可以找到某种日志来告诉我什么是错的?
答案 0 :(得分:4)
这是一个引起很多困惑的问题。来自djangoappengine docs:
此外,永远不要与其他管理一起运行manage.py runserver 命令同时。更改不会生效。那是一个 App Engine SDK限制可能会在以后的版本中得到修复。
因此,您无法同时执行manage.py runserver
和manage.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。