使用GoogleAppEngine的ListProperty

时间:2012-11-26 06:10:06

标签: python google-app-engine web-applications

如何使用Google App Engine分配ListProperty?

    name = self.request.get("name")
    description = self.request.get("description")
    list = '''insert code here'''

我希望列表像字典一样工作,这可以通过Google App Engine实现,如果是这样,如何:

[wordone:得分; wordtwo:得分; wordthree:得分]

^我希望list属性存储这样的数据,这怎么可能?

2 个答案:

答案 0 :(得分:2)

您实际上无法将真实字典存储为ListProperty中的类型(它仅支持数据存储区属性类型,其中dict不是一个),因此您不会能够得到你正在寻找的行为。所有数据都是相同的(即每个元素代表一个单词分数)?假设将每个单词作为自己的属性存储在模型上没有意义,一个“脏”的解决方案是创建ListProperty类型str,然后将单词和分数作为单独的元素追加。然后,当您在列表中搜索单词时,您将返回单词+ 1的索引位置处的值。这看起来像是:

class MyEntity(db.Model):
  name = db.StringProperty()
  description = db.TextProperty()
  word_list = db.ListProperty()

然后您可以添加以下字词:

new_entity = MyEntity()
new_entity.word_list = ['word1', 1, 'word2', 2, 'word3', 10]

然后,您可以查询特定实体,然后检查其word_list属性(列表),查找目标字并将元素返回到其后一个位置。


更复杂的建议

但是,如果这不是一个选项,你可以考虑创建另一个模型(让我们说WordScore)看起来像:

class WordScore(db.Model):
  word = db.StringProperty()
  score = db.IntegerProperty()

然后,每当您需要添加新分数时,您将创建一个WordScore实例,填写属性,然后将其分配给正确的实体。我没有测试任何这个,但这个想法是这样的:

# Pull the 'other' entity (this would be your main class as defined above)
q = OtherEntity.all()
q.filter('name =', 'Someone')
my_entity = q.get()

# Create new score
ws = WordScore(parent=my_entity)
ws.word = 'dog'
ws.score = 2
ws.put()

然后你可以通过做这样的事情为'某人'取出dog的分数(再次,现在完全未经测试 - 被警告:)):

# Get key of 'Someone'
q = OtherEntity.all()
q.filter('name =', 'Someone')
my_entity = q.get().key()

# Now get the score
ws = WordScore.all()
ws.filter('word = ', 'dog').ancestor(my_entity)
word_score = ws.get().score

答案 1 :(得分:2)

更改为NDB并使用Pickle属性:

  

Value是一个Python对象(例如列表或字典或字符串),可以使用Python的pickle协议进行序列化;数据存储区将pickle序列化存储为blob。默认情况下未编入索引。

NDB Properties

然后你可以直接使用它:

class table(ndb.Model):
    data_dict = ndb.PickleProperty(default = {})

然后

dd = table()
dd.data_dict['word_one'] = "Some_Score"