4

我已經瀏覽了文檔,文檔和SO問題和答案,並且仍然在理解這一小部分內容。你應該選擇哪一個?瞭解ndb密鑰類與KeyProperty

這是我到目前爲止(只是樣品)閱讀:

的關鍵類似乎相當簡單的我。當您創建一個ndb實體時,數據存儲會自動爲您創建一個鍵,通常以鍵(Kind,id)的形式爲您創建id。

所以說,你有這兩款車型:

class Blah(ndb.Model): 
    last_name = ndb.StringProperty() 

class Blah2(ndb.Model): 
    first_name = ndb.StringProperty() 
    blahkey = ndb.KeyProperty() 

所以只是用鑰匙種類和你想Blah1父母(或有幾個家庭成員具有相同的姓氏)

lname = Blah(last_name = "Bonaparte") 
l_key = lname.put() **OR** 
l_key = lname.key.id() # spits out some long id 

fname_key = l_key **OR** 
fname_key = ndb.Key('Blah', lname.last_name) # which is more readable.. 

則:

lname = Blah2(parent=fname_key, first_name = "Napoleon") 
lname.put() 

lname2 = Blah2(parent=fname_key, first_name = "Lucien") 
lname2.put() 

到目前爲止好(我認爲)。現在關於Blah2的KeyProperty。假設Blah1仍然是一樣的。

lname3 = Blah2(first_name = "Louis", blahkey = fname_key) 
lname3.put() 

這是正確的嗎?

如何查詢各種事情

查詢姓:

Blah.query() # all last names 
Blah.query(last_name='Bonaparte') # That specific entity. 

名字:

Blah2.query() 
napol = Blah2.query(first_name = "Napoleon") 
bonakey = napol.key.parent().get() # returns Bonaparte's key ?? 

bona = bonakey.get() # I think this might be redundant 

這是我迷路。如何使用key或keyproperty從名字中查找Bonaparte。我沒有在這裏添加它,也許應該有這個,因爲Keys記錄了祖先/父母,所以父母,祖父母,偉大的父母都在討論這個問題。

如何以及爲什麼要使用KeyProperty與固有的關鍵類。另外想象一下你有3個傳感器s1,s2,s3。每個傳感器都有數以千計的讀數,但是您想要保持與s1相關的讀數,以便您可以在s1中顯示今天的所有讀數。你會用哪個? KeyProperty還是關鍵類?我很抱歉,如果這已在其他地方得到解答,但我沒有看到有關選擇哪個以及爲什麼/如何的明確示例/指南。

回答

1

我是新來的NDB也是,而且我還沒有理解所有的現在,但我認爲,當你創建Blah2拿破崙父母,你將需要家長進行查詢或將不會出現。例如:

napol = Blah2.query(first_name = "Napoleon") 

不會得到任何東西(和你不使用NDB正確的格式),但使用父會做:

napol = Blah2.query(ancestor=fname_key).filter(Blah2.first_name == "Napoleon").get 

不知道這使一些輕爲你的問題。

2

我覺得混亂來自使用按鍵。密鑰與實體內部的任何屬性都沒有關聯,它只是一個唯一的標識符來定位一個實體。它可以是數字或字符串。

幸運的是,所有的代碼看起來除了這一行不錯:

fname_key = ndb.Key('Blah', lname.last_name) # which is more readable.. 

構建關鍵需要一個唯一的ID,這是不一樣的屬性。也就是說,它不會將變量lname.last_name與屬性last_name相關聯。相反,你可以這樣創建記錄:

lname = Blah(id = "Bonaparte") 
lname.put() 
lname_key = ndb.Key('Blah', "Bonaparte") 

你保證只有一個與該ID布拉赫實體。實際上,如果您使用像last_name這樣的字符串作爲ID,則不需要將其存儲爲單獨的屬性。將實體ID視爲唯一的額外字符串屬性。

下,一定要小心,不要認爲Blah.last_name和Blah2.first_name是唯一在查詢:

lname = Blah2(parent=fname_key, first_name = "Napoleon") 
lname.put() 

如果你做的比這一次更,會出現與拿破崙的FIRST_NAME多個實體(全部使用相同的父鍵)。

與您的代碼繼續上面:

napol = Blah2.query(first_name = "Napoleon") 
bonakey = napol.key.parent().get() # returns Bonaparte's key ?? 
bona = bonakey.get() # I think this might be redundant 

napol持有查詢,而不是結果。您需要致電napol.fetch()以獲得具有「Napolean」的所有實體(或者如果您確定只有一個實體,則爲napol.get())。 bonakey是相反的,它擁有父實體,因爲get()而不是Bonaparte的密鑰。如果您將.get()關閉,則bona將正確擁有父項。

最後,你對傳感器的問題。您可能不需要KeyProperty或「固有」鍵。如果你有一個閱讀類是這樣的:

class Readings(ndb.Model): 
    sensor = ndb.StringProperty() 
    reading = ndb.IntegerProperty() 

,那麼你可以將它們全部存儲在一個表中沒有鑰匙。 (您可能希望包含時間戳或其他屬性。)稍後,您可以使用此查詢檢索:

s1_readings = Readings.query(Readings.sensor == 'S1').fetch()