【问题标题】:Can't save a List to db.ListProperty() on Google App Engine无法将列表保存到 Google App Engine 上的 db.ListProperty()
【发布时间】: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


【解决方案1】:

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

$ dev_appserver.py --clear_datastore [myappname]

并重建它。在清除我的数据存储区并再次尝试后,由于某种原因,相同的代码再次运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 2017-08-28
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 2018-04-16
    相关资源
    最近更新 更多