我正在使用bulkloader将数据上传到我的App Engine数据存储中。
我似乎无法将字典存储到JsonProperty中,并且收到以下错误:
BadValueError:属性nearby_countries的不支持类型:< type'dict'>
我的模型将此属性定义为JsonProperty:
nearby_countries = ndb.JsonProperty()
我找到的唯一解决方法似乎是存储了我的值的json.dumps(),但我想这基本上存储了字典的字符串表示而不是字典本身。
我对JsonProperty的理解是它需要一个python对象作为值,我不应该为ndb将要处理的JSON序列化烦恼。我是对的吗?
Value是一个Python对象(例如列表或字典或字符串),可以使用Python的json模块进行序列化;数据存储区将JSON序列化存储为blob。
答案 0 :(得分:3)
经过大量尝试&错误以及谷歌搜索类似的帖子,我设法找到以下帖子,它引导我下面的解决方案:
http://blog.thekensta.com/2012/06/google-app-engine-bulk-loader-and-ndb.html
简而言之,JsonProperties存储为blob,我们需要传递bulkloader正确的transform方法,以便从json字符串生成blob。我们可以使用transform.blobproperty_from_base64
(来自google.appengine.ext.bulkload.transform
模块)
所以我将我的列表或字典转换为字符串JSON字符串表示,然后转换为blob,以便bulkloader可以存储它:
import_transform:“lambda x:transform.blobproperty_from_base64(base64.b64encode(bytes(json.dumps(x.strip(',')。split(',')))))”
同样的推理修复了TextProperty保存为Strings(在我上面的评论中提到)。您需要使用db.Text
作为转换函数:
import_transform:db.Text
为了保存repeated=True
TextProperty,我实际上也必须将它转换为blob:
import_transform:“lambda x:transform.blobproperty_from_base64(base64.b64encode(bytes(json.dumps(x.strip(',')。split(',')))))”
(在上面的示例中,我实际上将一个逗号分隔的字符串转换为要存储在TextProperty(repeated=True)
答案 1 :(得分:1)
一般来说,你对JsonProperty是正确的。但是,批量装载机是特殊的。老实说,我不太了解它是如何工作的,但在这种情况下,如果你需要自己调用json.dumps(),我不会感到惊讶。