2017-05-10 23 views
0

我有兩種:如何才達到加入情景在谷歌數據存儲NDB(Python庫)

class Professor(ndb.Model): 
    name = ndb.StringProperty() 
    email = ndb.StringProperty() 

class Student(ndb.Model): 
    professor = ndb.KeyProperty(kind=Professor) 
    name = ndb.StringProperty() 
    age = ndb.IntegerProperty() 

我想找到的所有學生的實體,其中教授的名字是「斯內普」。我怎樣才能做到這一點?

或者如果我採取https://cloud.google.com/appengine/articles/modeling的「一對多」示例。然後,我想查找Contact.name爲「scott」的所有PhoneNumber實體。這個怎麼做。

appengine示例只說明如何過濾PhoneNumber屬性。如果我想過濾相關的種類,即聯繫人屬性,該怎麼辦?

+0

這個問題有點堆棧溢出。我建議在[App Engine Google Group](https://groups.google.com/forum/#!forum/google-appengine)上發佈此信息以獲得更適合的最佳實踐類型的討論。我還建議包括一些你已經嘗試或考慮過的方法的例子。 – Nicholas

回答

0

你可以做這樣的事情。

# professor model 
class Professor(ndb.Model): 
    name = ndb.StringProperty() 
    email = ndb.StringProperty() 

# student model 
class Student(ndb.Model): 
    name = ndb.StringProperty() 
    age = ndb.IntegerProperty() 

snape = ndb.Key(Professor, 'snape') 
Professor(name="Professor Snape", email="[email protected]", key=snape).put() 


st1 = Student(name="Akshar", age=18, parent=snape) 
st2 = Student(name="Greg", age=19, parent=snape) 
st3 = Student(name="Alex", age=18, parent=snape) 

st1.put() 
st2.put() 
st3.put() 

# so lets say give me all students that has class with Professor Snape 
for student in Student.query(ancestor=snape).fetch(10): 
    print student.name 

# You should get something: 
Akshar 
Greg 
Alex 
+0

但是這種方法對教授可以擁有的學生數量有限制,對嗎?這限制了我們對教授的1MB大小? –

+0

每次交易你有10mb的限制推到數據存儲,這是很多!其他大部分API不會接近10MB。這一切都取決於你有什麼樣的模型,但例如我的模型在10mb我可以推~20K記錄。這個例子是正確的做法。看看我的評論,甚至有人降級它,但覆蓋基地http://stackoverflow.com/questions/43925030/google-cloud-datastore-only-store-unique-entity/43945541#43945541 – Askar

0

對於這一點,我會建議使用ndb.KeyProperty作爲學生模型的屬性來指給定教授。

class Professor(ndb.Model): 
    name = ndb.StringProperty() 

class Student(ndb.Model): 
    name = ndb.StringProperty() 
    prof = ndb.KeyProperty() 

通過上述實體種,一種可以查詢其名稱是「斯內普」使用僅鍵查詢所有的教授,並隨後查詢所有學生的教授是one of the retrieved keys

prof_keys = Professor.query().fetch(100, keys_only=True) 

if len(prof_keys) < 1: 
    print "Cannot a given professor's students" 
    return 

students = Student.query(Student.prof.IN(prof_keys)).fetch(100) 

if len(students) < 1: 
    print "Found no students whose professor is Snape" 
    return 

for student in students: 
    print "Found student named {} whose professor is Snape".format(student.name) 
相關問題