Хранить список словарей в GAE - PullRequest
3 голосов
/ 03 мая 2011

У меня есть список из примерно 20 объектов, и для каждого объекта я возвращаю список из 10 словарей.
Я пытаюсь сохранить список из 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

Я не уверен, что этот код пишется вообще.Если кто-то может помочь, это будет очень ценно.

Ответы [ 3 ]

4 голосов
/ 04 мая 2011

Когда я имею дело с типами данных, которые напрямую не поддерживаются 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 голосов
/ 22 февраля 2012

С тех пор, как это было написано, App Engine вытолкнул свою экспериментальную модель базы данных Python "ndb", которая содержит, в частности, JsonProperty, что-то, что очень хорошо непосредственно реализует то, что вы хотите.

Теперь вам нужночтобы запустить версию App Engine на Python 2.7, которая еще не совсем готова к работе, но в наши дни все выглядит довольно стабильно, сам GvR, кажется, пишет большую часть кода, который предвещает хорошее качество кода, иЯ собираюсь использовать это в производстве где-то в этом году ...

4 голосов
/ 03 мая 2011

Добро пожаловать в переполнение стека!

Я вижу несколько вопросов:

  1. Словари не являются поддерживаемыми типами значений для свойств App Engine.
  2. Вы храните только последнюю сущность; остальные отбрасываются.
  3. Вы используете ListProperty, но вместо добавления каждого элемента dict_info вы делаете одно добавление всего списка.

Поскольку вы не можете хранить необработанный словарь внутри свойства, вам необходимо сериализовать его в какой-либо другой формат, например, JSON или pickle. Вот пересмотренный пример использования 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).

...