簡體   English   中英

了解ndb密鑰類與KeyProperty

[英]Understanding ndb key class vs KeyProperty

我查看了文檔,文檔和SO問題和答案,並且仍在努力理解其中的一小部分內容。 您應該選擇哪個以及何時選擇?

這是我到目前為止所讀到的(只是示例):

關鍵課對我來說似乎很簡單。 創建ndb實體時,數據存儲區會自動為您創建一個鍵,通常以key(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還是關鍵類? 如果在其他地方已經回答這個問題,我很抱歉,但我沒有看到關於選擇哪個以及為什么/如何選擇的明確示例/指南。

我認為混淆來自使用密鑰。 密鑰不與實體內的任何屬性相關聯,它只是定位單個實體的唯一標識符。 它可以是數字或字符串。

幸運的是,除了這一行之外,你的所有代碼看起來都很好:

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

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

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

保證只有一個具有該ID的Blah實體。 實際上,如果使用類似last_name的字符串作為ID,則無需將其存儲為單獨的屬性。 將實體ID視為唯一的額外字符串屬性。

接下來,注意不要認為Blah.last_name和Blah2.first_name在您的查詢中是唯一的:

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

如果您不止一次這樣做,將會有多個具有第一個拿破侖名稱的實體(所有實體具有相同的父鍵)。

繼續上面的代碼:

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持有一個Query,而不是結果。 您需要調用napol.fetch()來獲取具有“ napol.get() ”的所有實體napol.get()如果您確定只有一個實體,則使用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()

我也是NDB的新手,我現在仍然不理解所有,但我認為當你用拿破侖的父母創建Blah2時,你需要父母查詢它或不會出現。 例如:

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

不會得到任何東西(並且你沒有使用正確的NDB格式),但使用父代將會:

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

不知道這是否為你的問題提供了一些啟示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM