2011-11-22 54 views
6

更新:我注意到當我使用視圖(和create_object函數)保存實體時,實體被保存(並且在數據存儲查看器中可用)。但是當我使用shell(manage.py shell)來創建和保存新實體時,它不會被提交到存儲器(但仍然可以在Tes.objects.all()中看到)。使用google appengine在django-nonrel中保存實體


我開始與Django的nonrel與谷歌AppEngine上玩,我收到由爲節約實體爲簡單的事情感到沮喪。

我已經按照instruction中所述設置了我的環境。我設法運行示例應用程序,它運行正常。我想擴展它,以便將我的實體保存到存儲中。要做到這一點:

  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 
    

腳本運行沒有錯誤。當我連續運行幾次時,它會打印越來越多的「測試」字符串。但是,當我嘗試運行一分鐘後,Tes.objects.all()什麼都不返回。在那段時間內,數據存儲文件改變了它的大小(但也許這只是某種日誌)。當我看到http://localhost:8000/_ah/admin/datastore時,我只能從select字段中選擇AhAdminXrsfToken

無論如何,我錯過了什麼?我在哪裏可以找到某種能夠告訴我發生了什麼問題的日誌?

回答

4

這是一個造成很多混淆的問題。從djangoappengine docs

此外,請不要同時運行manage.py runserver和其他管理 命令。這些更改不會生效。這是一個 App Engine SDK的限制,可能會在更高版本中得到修復。

所以你不能同時做manage.py runservermanage.py shell。如果這樣做,對其中一個數據存儲的更改將不會在另一箇中可見。 App Engine SDK實施的本地數據存儲上存在鎖定。確保在啓動shell之前已經停止了服務器。

-1

如果你正在創建一個實體而不是保存它,那麼它應該是t.put()?我使用put()來創建一個實體,它適用於我。如果你導入django,你可能想知道django有其他選擇,比如我的選擇GAE + Jinja2 + WTForms,特別是現在google.db.djangoforms已經被棄用了,爲表單,模板引擎和db框架選擇一個表單框架而且你不必導入django,這往往會導致你導入比你需要的更多的django。

所以我的建議是避免import django...而改用Jinja2 + WTForms。如果你真的想在應用引擎上使用django,那麼你可能需要檢查www.allbuttonspressed.com這個項目,它可以爲所有的django提供谷歌應用引擎,但是當我懷疑我們需要的是模板引擎時,一個表單框架,我們可以沒有Django。

+1

這真的沒有回答這個問題。 –

+0

「我錯過了什麼?」被問及我的答案是保存和創建之間的區別。我想說的是,它可以是使用save()和put()進行保存和創建的區別,並且有完整的django可以替代。 –

相關問題