在Google App Engine中使用django-nonrel保存实体

6 投票
2 回答
523 浏览
提问于 2025-04-17 06:50

更新:我注意到,当我通过视图(和create_object函数)保存实体时,它们被保存了(并且可以在Datastore Viewer中看到)。但是,当我使用shell(manage.py shell)创建并保存新的实体时,它并没有被提交到存储中(但仍然可以在Tes.objects.all()中看到)。


我开始尝试使用django-nonrel和谷歌的appengine,但在保存实体这样简单的事情上感到很沮丧。

我按照这个说明设置了我的环境。我成功运行了示例应用程序,并且运行得不错。我想扩展它,以便将我的实体保存到存储中。为此:

  1. 我添加了一个新的django模块,里面有models.py:

    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
    

这个脚本运行没有错误。当我连续运行几次时,它打印出越来越多的“test”字符串。但是当我在间隔一分钟后再运行它时,Tes.objects.all()却什么都不返回。在这段时间里,datastore文件的大小发生了变化(但也许这只是某种日志)。当我查看http://localhost:8000/_ah/admin/datastore时,我只能从选择字段中选择AhAdminXrsfToken

总之,我缺少了什么?我在哪里可以找到一些日志,告诉我出了什么问题?

2 个回答

-1

如果你是在创建一个实体,而不是保存它,难道不应该用 t.put() 吗?我用 put() 来创建实体,这对我来说是有效的。而且如果你在使用 Django,可能你会想知道还有其他选择,比如我选择的 GAE + Jinja2 + WTForms,特别是现在 google.db.djangoforms 已经不再支持了。在选择表单框架、模板引擎和数据库框架时,你其实不一定非要引入 Django,因为这通常会让你引入很多不必要的东西。

所以我建议你避免使用 import django...,而是用 Jinja2 + WTForms。如果你真的想在应用引擎上使用 Django,那么你可以看看项目 www.allbuttonspressed.com,它可以让你在 Google 应用引擎上使用所有 Django 的功能。但要确保你真的需要这么多 Django,因为我觉得我们只需要一个模板引擎和一个表单框架,其实可以不依赖 Django。

4

这个问题让很多人感到困惑。根据djangoappengine 的文档

另外,绝对不要同时运行 manage.py runserver 和其他管理命令。这样做的话,修改不会生效。这是 App Engine SDK 的一个限制,可能在以后的版本中会修复。

所以,你不能同时使用 manage.py runservermanage.py shell。如果你这样做了,一个命令对数据的修改在另一个命令中是看不到的。因为 App Engine SDK 会对本地数据存储加锁。在你启动 shell 之前,确保已经停止了服务器。

撰写回答