2011-03-23 103 views
1

在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() 
    ... 

难道节约资源/更快?

+1

我对你的模型有一些建议。你可能应该把'category'和'author'作为一个'StringListProperty'(或者他们称之为的任何东西,我一会儿没有用过GAE)而不是一个字符串。操纵和搜索更容易。 – Haochi 2011-03-23 15:39:28

回答

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

您不需要用例的键名列表。

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

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搜索时

相关问题