使用AppEngine bulkloader加载db.ListProperty()

时间:2011-07-09 04:42:25

标签: python google-app-engine

我正在尝试使用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。

    
  

有人建议出路吗?

谢谢,

贾斯汀

3 个答案:

答案 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