2011-05-03 68 views
3

我有一個約20個對象的列表,並且爲每個對象返回一個包含10個詞典的列表。
我想存儲每個對象在GAE列表中的10個字典的列表;我認爲我沒有正確編寫代碼將這些信息存儲到GAE。
以下是我有: 我的主要請求處理程序之前,我有這個類:在GAE中存儲詞典列表

class Tw(db.Model): 
    tags = db.ListProperty() 
    ip = db.StringProperty() 

在我的主要請求處理我有以下幾點:

for city in lst_of_cities: # this is the list of 20 objects 
    dict_info = hw12.twitter(city) # this is the function to get the list of 10 dictionaries for each object in the list 
    datastore = Tw() # this is the class defined for db.model 
    datastore.tags.append(dict_info) # 
    datastore.ip = self.request.remote_addr 
datastore.put() 

data = Data.gql("") #data entities we need to fetch 

我不知道如果這個代碼是根本寫的。如果任何人可以請幫助它將不勝感激。

+0

聽起來像您的列表相當靜態。爲什麼不把它存儲在代碼或數據文件中? – 2011-05-03 19:40:03

回答

4

歡迎來到Stack Overflow!

我看到幾個問題:

  1. Dictionary不supported value types App Engine的性能。
  2. 您只存儲最後一個實體;其餘的都被丟棄。
  3. 您正在使用ListProperty,但不是追加dict_info的每個元素,而是完成整個列表的單個附加。

既然你不能在一個屬性中存儲原始字典,你需要將它序列化爲其他格式,比如JSON或pickle。下面是使用鹹菜修訂例如:

from google.appengine.ext import db 
import pickle 

class Tw(db.Model): 
    tags = db.BlobProperty() 
    ip = db.StringProperty() 

entities = [] 
for city in lst_of_cities: 
    dict_info = hw12.twitter(city) 
    entity = Tw() 
    entity.tags = db.Blob(pickle.dumps(dict_info)) 
    entity.ip = self.request.remote_addr 
    entities.append(entity) 

db.put(entities) 

當你以後獲取的實體,您可以用pickle.loads(entity.tags)檢索您的字典清單。

4

當我處理Google App Engine沒有直接支持的數據類型(如字典或自定義數據類型)時,我通常會採用方便的PickleProperty

from google.appengine.ext import db 
import pickle 

class PickleProperty(db.Property): 
    def get_value_for_datastore(self, model_instance): 
     value = getattr(model_instance, self.name, None) 
     return pickle.dumps(value) 

    def make_value_from_datastore(self, value): 
     return pickle.loads(value) 

一旦宣佈PickleProperty類的commons.py模塊中,你可以用它來存儲您的自定義數據像這樣的東西:

from google.appengine.ext import db 
from commons import PickleProperty 

class Tw(db.Model): 
    tags = PickleProperty() 
    ip = db.StringProperty() 

entities = [] 
for city in lst_of_cities: 
    dict_info = hw12.twitter(city) 
    entity = Tw() 
    entity.tags = dict_info 
    entity.ip = self.request.remote_addr 
    entities.append(entity) 

db.put(entities) 

檢索數據回來去:

entity.tags 
4

由於是這樣寫的,App Engine推出了他們的實驗性「ndb」Python數據庫模型,其中特別包含JsonProperty,帽子很好直接實現你想要的。

現在,您需要運行App Engine的Python 2.7版本,它仍然沒有完全準備好生產,但現在看起來都很穩定,GvR自己似乎正在編寫很多代碼預示着代碼質量,我打算在今年的某個時候使用它...