如何在Python / Google应用引擎中获取关键名称列表?

时间:2011-03-23 15:29:25

标签: python google-app-engine key

在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 个答案:

答案 0 :(得分: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)]

答案 1 :(得分:1)

您不需要用例的密钥名称列表。

如果您想查看数据库中是否已有图书,只需执行Book.get_by_key_name(someISBN)即可。还有get_or_insert用于写入,它将检查您正在添加的实体是否已经存在于数据库中,如果不存在则写入它,如果存在则返回它。

答案 2 :(得分: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_onlykey_name