【发布时间】:2013-12-18 11:01:02
【问题描述】:
尝试将列表保存到 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))
是:
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)
EDIT2:
我能够让它工作——contactCountry 最初在我的数据存储中作为 db.StringProperty() 并且已经填充了值。我想将contactCountry 更改为列表,因此我将models.py 文件更改为db.ListProperty(str),这是我开始看到错误的时候。我决定尝试清除我的数据存储区
$ dev_appserver.py --clear_datastore [myappname]
并重建它。清除我的数据存储并再次尝试后,由于某种原因,相同的确切代码再次起作用。
【问题讨论】:
-
如何将
contactCountry分配给要更新的实体? -
我更新了我的原始帖子,展示了我如何将 contactCountry 分配给实体...谢谢
-
这看起来不错,但是现在有太多零散的代码,这使得很难确切地看到发生了什么。我认为,如果您发布整个处理程序会很有帮助,这样我们就可以确定在您实际将其放回数据存储区时,contactCountry 是应该的。
-
已解决...我最初将contactCountry 作为db.StringProperty(),直到我发现我可能有多个国家,所以我需要将它存储为一个列表。我相应地更改了我的 models.py 文件,然后遇到了那个错误。但是,由于我的数据库已经填充了 contactCountry 作为字符串,我尝试删除数据库并再次尝试: $ dev_appserver.py --clear_datastore=yes [myappname] 然后再次运行代码,它现在可以工作了......不过,我不知道为什么.. 谢谢你的帮助!
-
执行 put 时,会将整个实体放入数据存储区。因此,您可能做了一个 get 操作,它将“ListProperty”作为字符串提取,因为它是存储的。然后,当您执行 put 时,它会尝试按原样放置该字符串 - 然后会中断。清除数据存储区将阻止您将此 ListProperty 作为 StringProperty 获取实体,因此错误会停止。如果您确实更改了模型,请确保您处理从数据存储中获取旧类型实体的情况。
标签: python google-app-engine google-cloud-datastore