如何在Python/Google应用引擎中获取键名列表?
在Python和Google应用引擎中,我想把一个属性存储为键名,这样可以节省资源并提高速度。但我不知道怎么获取键名的列表。
举个例子,考虑一下数据模型:
class Book(db.Model):
isbn = db.StringProperty() # Make this a key name instead.
category = db.StringProperty()
author = db.StringProperty()
title = db.StringProperty()
...
现在假设我把键名设置为isbn,而不是把它当作一个属性名:
new_book = Book(category="fantasy,comedy", title="The Light Fantastic", author="Terry Pratchett", key_name=isbn_number)
我想,如果我能找到获取键名列表的方法,是不是就能节省资源呢?比如说,当我想检查某本书是否已经在收藏里时。
这样理解对吗?我该怎么获取键名的列表呢?
如果不是这样的话,那么下面这个方案是否可以作为一个不错的折中选择:
class ISBN(db.Model):
isbn = db.StringProperty()
class Book(db.Model):
isbn = db.ReferenceProperty(ISBN)
category = db.StringProperty()
author = db.StringProperty()
title = db.StringProperty()
...
这样做会节省资源或者更快吗?
3 个回答
1
创建一本书
b = Book(key_name='isbn:0134815100494', **props)
b.put()
查询
keys = Book.all(keys_only=True).fetch(100)
key_names = [key.name() for key in keys]
在搜索时要注意 keys_only
和 key_name
1
你不需要为你的情况准备一个关键字名称的列表。
如果你想查看一本书是否已经在数据库里,只需使用 Book.get_by_key_name(someISBN)
这个命令就可以了。如果你要添加新的数据,可以用 get_or_insert
,这个方法会先检查你要添加的内容是否已经存在于数据库中,如果不存在就添加进去,如果已经存在则直接返回它。
3
第一种方法是把ISBN作为关键字:
class Book(db.Model):
#isbn is key, so it shouldn't be a property
category = db.StringProperty()
author = db.StringProperty()
title = db.StringProperty()
new_book = Book(category="fantasy,comedy", title="The Light Fantastic", author="TerryPratchett", key_name=isbn_number)
然后获取所有ISBN的列表:
isbns = [b.name() for Book.all(keys_only=True)]