2011-03-23 67 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搜索時

相關問題