0

В настоящее время у меня есть следующий код:Как сохранить данные как BlobProperty вместо нескольких ListProperties?

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) выглядит с таким подходом? Как найти запись для обновления?

ответ

1

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

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

Это не сразу понятно, почему ваш пересмотр является более оптимальным в вашем случае, но Я возьму ваше слово за это. :)

0

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