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

1 投票
3 回答
1080 浏览
提问于 2025-04-16 14:16

在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_onlykey_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)]

撰写回答