Datastore список списков - PullRequest
       14

Datastore список списков

1 голос
/ 08 января 2010

Мне нужно сделать свойство списка, которое будет содержать списки, что-то вроде: db.ListProperty (list (str))

Я знаю, что list (str) не является поддерживаемым типом значения, так как я себе представлялполучил исключение "ValueError".Подумал, может быть, есть творческая идея о том, как преодолеть это:)

Спасибо!

Ответы [ 3 ]

6 голосов
/ 11 января 2010

Расширяя предложение Адама, вы можете протолкнуть травление в свой собственный класс недвижимости. Вот пример, который обрабатывает проверку и преобразование предоставленного списка в тип Blob и из него. Предоставленный список может содержать любой тип данных или комбинацию типов данных, поскольку он просто хранит стандартный список Python.

import pickle

class GenericListProperty(db.Property):
  data_type = db.Blob

  def validate(self, value):
    if type(value) is not list:
      raise db.BadValueError('Property %s must be a list, not %s.' % (self.name, type(value), value))
    return value

  def get_value_for_datastore(self, model_instance):
    return db.Blob(pickle.dumps(getattr(model_instance,self.name)))

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

Вы используете его как любое другое свойство.

class ModelWithAGenericList(db.Model):
  mylist = GenericListProperty()

class MainHandler(webapp.RequestHandler):
  def get(self):
    db.delete(ModelWithAGenericList.all())

    m = ModelWithAGenericList(mylist = [[1,2,3],[4,5,6],6])
    m.put()

    m = ModelWithAGenericList.all().fetch(1)[0]
    self.response.out.write(str(m.mylist))
    # Outputs: [[1, 2, 3], [4, 5, 6], 6]
1 голос
/ 08 января 2010

Вы можете использовать pickle для сериализации вашего списка и сохранения его в поле BlobProperty.

0 голосов
/ 06 августа 2017

Если вы используете Java, вы можете хранить список списков в виде большого двоичного объекта (при условии, что они являются стандартными списками и их содержимое сериализуемо), но это лишает вас возможности получить хранилище данных для поиска по его содержимому.

</p> <pre><code>// ----------------------------------------------- import java.io.Serializable; import java.io.ByteArrayOutputStream; import java.io.ObjectOutputStream; import java.io.IOException; import com.google.appengine.api.datastore.Blob; Serializable s = (Serializable) myListOfLists; ByteArrayOutputStream baos = new ByteArrayOutputStream(); try{ ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(s); oos.close(); }catch(IOException ioexception){ } entity.setProperty("data", new Blob(baos.toByteArray())); // ------------------------------------------- import java.io.ByteArrayInputStream; import java.io.ObjectInputStream; import java.io.IOException; import com.google.appengine.api.datastore.Blob; ByteArrayInputStream bais = new ByteArrayInputStream(((Blob)e.getProperty("data")).getBytes()); try { ObjectInputStream ois = new ObjectInputStream(bais); myListOfLists = (List<List<String>>) ois.readObject(); } catch (IOException e1) { } catch (ClassNotFoundException e1) { }

...