我正在尝试使用bulkloader填充db.ListProperty()模型字段。
我正在使用导入转换功能,如下所示:
def parse_array(fn):
def wrapper(value):
return [fn(seg) for seg in re.split("\\,", value) if not seg=='']
return wrapper
配置如下:
import_transform:lib.bulkloader_helpers.parse_array(int)
某些阵列是空的,这些都会导致问题。当我上传时:
哦,哦。好的,让我们改变导入转换功能:BadValueError:不能将空列表用作属性值;属性xxx是[]。
def parse_array(fn):
def wrapper(value):
args[fn(seg) for seg in re.split("\\,", value) if not seg=='']
if args==[]:
return None
else:
return args
return wrapper
现在空列表加载就好了。但是,当应用程序尝试加载模型时:
BadValueError:属性xxx是必需的
我也无法设置db.ListProperty(required = False):
google.appengine.ext.db.ConfigurationError:必须为True。
有人建议出路吗?
谢谢,
贾斯汀
答案 0 :(得分:1)
这是一个已知的bug (Issue 3646),带有App Engine开发环境。
解决方法是更改(从版本1.9.6开始)google.appengine.api.datastore_types.py第1530行,其中包含:
if not values:
要:
if not values_type is list and not values:
之后您可以正确插入
[]
表示空数组,它应该可以工作。
答案 1 :(得分:1)
谷歌还没有解决这个问题(2013年2月,API版本1.7.4),所以这里的解决方法不涉及修补AppEngine代码:
首先使用更新后的import_transform函数,该函数返回None
而不是空列表。然后将实体的post_import_function
添加到bulkloader.yaml(docs),检查None
的列表属性并从实体中删除它们,从而将它们设置回空列表: / p>
def post_import(input_dict, instance, bulkload_state_copy):
if instance["list_prop_name"] is None:
del instance["list_prop_name"]
return instance
答案 2 :(得分:0)
完全省略required
参数。如果已提供,则必须将其设置为True
,但不提供它会使其False
。