如何将数据保存为BlobProperty而不是多个ListProperties?

时间:2012-02-29 19:32:27

标签: python google-app-engine google-cloud-datastore python-2.5

目前我有以下代码:

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_namefield_valuefield_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 个答案:

答案 0 :(得分:1)

如果user.fields是一个字段列表,其中'f'是字段名称,这是您当前问题的一个可能答案:

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

目前还不清楚为什么你的版本在你的情况下更加优化,但我会接受你的意见。 :)

答案 1 :(得分:0)

您可以使用json或pickle序列化对象。 所以举个例子。如果您的模型包含属性:udata = db.BlobProperty() 序列化对象如:.. undata = pickle.dumps(object)。