ndb

2014-06-24 5 views
8

में कई से अधिक रिश्ते ndb के साथ कई से अधिक रिश्तों को मॉडल करने का प्रयास कर रहे हैं। क्या कोई ऐसा करने के लिए एक अच्छा उदाहरण बता सकता है?ndb

class Person(ndb.Model): 
    guilds = ndb.KeyProperty(kind="Guild", repeated=True) 

class Guild(ndb.Model) 
    members = ndb.KeyProperty(kind="Person", repeated=True) 

    def add_person(self, person): 
     self.members.append(person.key) 
     self.put() 
     person.guilds.append(self.key) 
     person.put() 

इस इसके बारे में जाने के लिए सही तरीका है:

यहाँ पर मैं क्या पल में है का एक उदाहरण है? मेरे पास चारों ओर अच्छा लगा है लेकिन इस विषय पर कोई अच्छा दस्तावेज नहीं दिख रहा है।

डेटास्टोर दर्शक में, मैं देख सकता हूं कि यह रिश्ते कुंजी की एक सूची के रूप में संग्रहीत किया जा रहा है, जो मुझे उम्मीद है।

हालांकि, जब मैं उन्हें इस तरह व्यक्ति वर्ग के तरीकों में इस्तेमाल करने की कोशिश:

for guild in self.guilds: 

मैं:

TypeError: 'KeyProperty' object is not iterable 
+0

'स्वयं के लिए गिल्ड इन गिल्ड' काम करना चाहिए। अगर आप व्यक्ति में 'दोहराया = सही' डालते हैं तो दोबारा जांचें: 'गिल्ड्स = ndb.KeyProperty (दयालु = "गिल्ड", दोहराया = सही) ' –

+0

ध्यान दें कि दोहराए गए गुणों के साथ प्राप्त किए जा सकने वाले रिश्तों की संख्या के लिए ऊपरी सीमा है । यदि आपको कई हज़ारों या उससे अधिक लोगों की ज़रूरत है, तो कई रिश्तों के लिए बहुत से लोग हैं, या आपको अपने रिश्तों को नाम देने की जरूरत है, तो एक मध्यवर्ती इकाई जिसमें रिश्तों के प्रत्येक छोर को इंगित करने वाली प्रत्येक दो प्रमुखप्रोर्टीजियां भी काम करती हैं, लेकिन यह आमतौर पर कम कुशल होती है और आपके पास हो सकता है अगर आपको अतिरिक्त लुकअप से बचने के लिए सारांश दृश्यों की आवश्यकता है तो इस इकाई में कुछ अनावश्यक जानकारी स्टोर करने के लिए। –

उत्तर

12

नहीं। इसके बारे में जाने के लिए सही तरीका नहीं है यही कारण है कि।

आप केवल एक ही बार-बार संपत्ति के साथ एक बहुत-से-अनेक संबंध मॉडल कर सकते हैं: (अपने व्यापार

class Person(ndb.Model): 
    @property 
    def guilds(self): 
     return Guild.query().filter(Guild.members == self.key) 

class Guild(ndb.Model): 
    members = ndb.KeyProperty(kind="Person", repeated=True) 

    def add_person(self, person): 
     self.members.append(person.key) 
     self.put() 

रिश्ते की दिशा कई कारकों पर निर्भर:

class Person(ndb.Model): 
    guilds = ndb.KeyProperty(kind="Guild", repeated=True) 

class Guild(ndb.Model): 
    @property 
    def members(self): 
     return Person.query().filter(Person.guilds == self.key) 

    def add_person(self, person): 
     person.guilds.append(self.key) 
     person.put() 

या साथ viceversa मॉडल, प्रति व्यक्ति गिल्डों की संख्या, प्रति गिल्ड सदस्यों की संख्या इत्यादि)

+0

यह बहुत अच्छा काम किया। अभी भी यह सुनिश्चित नहीं है कि मुझे क्यों मिल रहा था: 'टाइप एरर:' कीप्रॉपर्टी 'ऑब्जेक्ट एक ही प्रकार की संपत्ति के साथ नहीं है। यह मेरे लिए काम करता है लेकिन मुझे लगता है कि दोहराए गए कीप्रोपर्टी पर ऊपरी सीमा 5000 है, इसलिए अधिक इकाइयों वाले लोगों के लिए उतना अच्छा नहीं हो सकता है। – chrisw

+0

आपका स्वागत है। यदि आपके रिश्ते के हर तरफ बहुत सारी संस्थाएं हैं, तो आपको रिश्ते के लिए एक और इकाई बनाना चाहिए, उसी तरह आप रिलेशनल डीबी में कई से अधिक रिश्तों के लिए एक नई टेबल बनाते हैं। लेकिन याद रखें कि आप डेटास्टोर प्रश्नों पर शामिल नहीं हो सकते हैं। –

+0

ऐसा कुछ है जो आपको टालना चाहिए। इस http://stackoverflow.com/questions/15377119/gae-ndb-design-performance-and-use-of-repeated-properties/15418435#15418435 – EsseTi

संबंधित मुद्दे