Как сохранить данные как BlobProperty вместо нескольких ListProperties? - PullRequest
0 голосов
/ 29 февраля 2012

В настоящее время у меня есть следующий код:

class User(db.Model):
    field_names = db.StringListProperty(indexed=False)
    field_values = db.StringListProperty(indexed=False)
    field_scores = db.ListProperty(int, indexed=False)

def fields_add(user_key_name, field_name, field_value, field_score):
    user = User.get(user_key_name)
    if user:
        try:
            field_index = user.field_names.index(field_name) # (1)
            user.field_values[field_index] = field_value
            user.field_scores[field_index] = field_score
        except ValueError:
            # field wasn't added to the list before
            user.field_names.append(field_name)
            user.field_values.append(field_value)
            user.field_scores.append(field_score)
        user.put()

Хорошо работает, но я бы хотел оптимизировать это - сериализовать field_name, field_value и field_score и хранить в одном BlobProperty:

class User(db.Model):
    fields = db.ListProperty(indexed=False)

    f = {
      'f': field_name,
      'v': field_value,
      's': field_score,
    }
    user.fields = simplejson.dumps(f)

Но как должен выглядеть код (1) при таком подходе? Как найти запись для обновления?

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Если user.fields - список диктов, где 'f' - имя поля, это один из возможных ответов на ваш ближайший вопрос:

field_index = [field['f'] for field in user.fields].index(field_name)

Не сразу понятно, почему ваша ревизия более оптимальна в вашем случае, но я верю вашему слову. :)

0 голосов
/ 02 марта 2012

Вы можете сериализовать объекты с помощью JSON или Pickle. Так, например. Если ваша модель содержит свойство: udata = db.BlobProperty () Сериализация объекта, например: ..udata = pickle.dumps (object).

...