无法将List保存到Google App Engine上的db.ListProperty()

4

尝试将列表保存到Google数据存储时,我遇到了一个错误:

raise BadValueError('Property %s must be a list' % self.name)
BadValueError: Property contactCountry must be a list

contactCountry被创建为列表:

contactCountry = list()

并且后续添加了:

contactCountry.append(xmlDoc.getElementsByTagName('country')[0].childNodes[0].nodeValue)

针对这个具体的例子,虽然只有一个元素,但它仍然是一个列表……但当我尝试保存时,却出现了错误。有什么想法吗?

输出:

logging.info(contactCountry)
logging.info(type(contactCountry))

Are:

INFO     2013-12-02 16:38:27,349 downloadAndUpdate.py:72] [u'United States']
INFO     2013-12-02 16:38:27,349 downloadAndUpdate.py:73] <type 'list'>

当我遇到这个错误时,我完全被卡住了,谢谢!

编辑:

以下是我定义和分配contactCountry的方式:

Database = models.Database() #construct Database object
Information =  Database.get_or_insert(Identifier)
Information.contactCountry = contactCountry

在同一目录下,我的models.py文件的相关部分具有以下结构:

class Database(db.Model):
        contactCountry = db.ListProperty(str)

编辑2:

我最终解决了问题——contactCountry原来是以db.StringProperty()类型存储在我的数据存储中,并且已经填充了值。我想将contactCountry更改为列表,因此我将models.py文件更改为db.ListProperty(str),这时我开始看到错误。我决定尝试只清除我的数据存储:

$ dev_appserver.py --clear_datastore [myappname]

并重新构建它。在清除我的数据存储并重试之后,完全相同的代码再次奇迹般地工作了。


1
你是如何将 contactCountry 分配给你正在更新的实体的? - Daniel Roseman
我更新了原始帖子,展示了如何将contactCountry分配给实体...谢谢。 - user3058197
1
这看起来还不错,但现在有太多碎片化的代码,这使得很难准确地看到正在发生什么。我认为如果您发布整个处理程序,我们就可以确定在您实际将其放回数据存储时contactCountry是否符合预期。 - Daniel Roseman
1
当您执行put操作时,它会将整个实体放入数据存储中。因此,您可能已经执行了get操作,该操作将“ListProperty”作为字符串提取,因为它是以此方式存储的。然后,当您执行put操作时,它将尝试将该字符串原样放置--这将导致错误。清除数据存储将防止您获取具有此ListProperty作为StringProperty的实体,从而停止错误。如果您更改了模型,请确保处理从数据存储中获取旧类型实体的情况。 - Patrick Costello
这很有道理,Patrick。谢谢你澄清问题! - user3058197
显示剩余2条评论
1个回答

0

我成功让它工作了——contactCountry最初在我的数据存储中是一个db.StringProperty(),并且已经填充了值。我想将contactCountry更改为列表,因此我将我的models.py文件更改为db.ListProperty(str),这时我开始看到错误。我决定尝试清除我的数据存储:

$ dev_appserver.py --clear_datastore [myappname]

然后重新构建它。不知何故,在清除我的数据存储并再次尝试后,完全相同的代码再次起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接