Как поместить словарь в хранилище данных? - PullRequest
8 голосов
/ 11 ноября 2009

Есть ли хороший способ сохранить словарь Python в хранилище данных? Я хочу сделать что-то вроде следующего:

from google.appengine.ext import db

class Recipe(db.Model):
  name = db.StringProperty()
  style = db.StringProperty()
  yeast = db.StringProperty()
  hops = db.ListofDictionariesProperty()

Конечно, эта последняя строка на самом деле не работает. Мне нужно, чтобы прыжки были списком пар ключ-значение, где ключ всегда является строкой, а значение может быть строкой, int или float, но я не вижу ничего, что позволило бы мне сделать это в Классы недвижимости .

Ответы [ 7 ]

7 голосов
/ 11 ноября 2009

Вы можете использовать JSON

7 голосов
/ 11 ноября 2009

Сериализация диктата с repr - хороший способ сделать это. Затем вы можете восстановить его с помощью eval или, если вы не доверяете данным, " safe eval ".

Преимущество repr перед засечкой заключается в том, что данные доступны для чтения в базе данных, даже в отчаянных случаях.

2 голосов
/ 11 ноября 2009

Я почти уверен, что нет способа сохранить словарь Python. Но почему бы просто не поместить то, что вы хотели бы в прыжки, в качестве второй модели?

Кроме того, как упоминал Джон, вы могли бы использовать pickle, но (и исправьте меня, если я ошибаюсь) сохраните его как Blob вместо него.

2 голосов
/ 11 ноября 2009

Вы можете выделить словарь и сохранить его как StringProperty.

1 голос
/ 11 ноября 2009

В основном вы можете использовать pickle, использовать db.Expando и сделать каждый ключ в dict отдельным свойством, или иметь StringListProperty ключей и одно из значений и zip () возвращать их в dict при чтении. .

0 голосов
/ 18 августа 2018

Вы можете использовать JsonProperty . Значение - это объект Python (такой как список, или dict, или строка), который сериализуем с использованием модуля json в Python; Cloud Datastore хранит сериализацию JSON в виде большого двоичного объекта. Индексируется по умолчанию. Необязательный аргумент ключевого слова: сжатый.

from google.appengine.ext import ndb

class Article(ndb.Model):
    title = ndb.StringProperty(required=True)
    stars = ndb.IntegerProperty()
    tags = ndb.StringProperty(repeated=True)
    info = ndb.JsonProperty()
0 голосов
/ 15 мая 2013

Я сделал это так:

class MyEntity(db.Model):
    dictionary_string = db.StringProperty()

payload = {{}...{}}

# Store dict
my_entity = MyEntity(key_name=your_key_here)
my_entity.dictionary_string = str(payload)
my_entity.put()

# Get dict
import ast
my_entity_k = db.Key.from_path('MyEntity', your_key_here)
my_entity = db.get(my_entity_k)
payload = ast.literal_eval(my_entity.dictionary_string)
...