2012-06-20 9 views
6

मैंने this question पढ़ा है और सरल और स्पष्ट उत्तर है लेकिन यह मेरे मामले में उपयोगी नहीं है क्योंकि उत्तर नेस्टेड for पर विचार नहीं किया जाता है। कृपया, कोड देखें:एनडीबी में बैक-रेफरेंस प्रॉपर्टी का विकल्प क्या है?

class SuperCat(ndb.Model): 

class Category(ndb.Model): 
    supercat = ndb.KeyProperty(kind=SuperCat) 

class SubCat(ndb.Model): 
    category = ndb.KeyProperty(kind=Category) 

हैंडलर:

Categories = ndb.gql("SELECT * FROM Category WHERE supercat = :1", supercat_key) 
self.generate('supercat.html', {'Categories': Categories}) 
टेम्पलेट में

, पुराने db.Model और बैक-संदर्भ संपत्ति के साथ इस पर्याप्त है:

{{ for Category in Categories }} 
    {{ for SubCat in Category.subcat_set }} # this is the back-reference in action 

क्या है ऐसी डेटा संरचना की सेवा के लिए समान रूप से सरल विकल्प?

+0

ऐसा लगता है कि [संरचित गुण] (https://developers.google.com/appengine/docs/python/ndb/properties#structured) एक अच्छी शुरुआत बिंदु है .. –

उत्तर

11

चलिए इसे व्यवस्थित रूप से देखें। सबसे पहले, db->ndb translation guide हमें बताता है कि किसी दिए गए श्रेणी उदाहरण के लिए उपश्रेणी उदाहरणों वापस भेजने के इस प्रकार है:।

subcats_query = SubCategory.query(SubCategory.category == cat.key) 

(ध्यान दें कि मैं उदाहरणों/संस्थाओं और वर्गों/मॉडलों के लिए CapWords के लिए लोअरकेस नामों का उपयोग करें तो बिल्ली एक है । श्रेणी इकाई)

तो अजगर में, हम इस प्रकार अपने डबल पाश लिखते थे:

for cat in categories: 
    for subcat in SubCat.query(SubCat.category == cat.key): 
     ...blah... 

आदेश कुछ है कि टेम्पलेट से आसानी से सुलभ है में इस बारी करने के लिए, के श्रेणी पर एक नई विधि को परिभाषित करते हैं कक्षा:

class Category(ndb.Model): 

    supercat = ndb.KeyProperty(kind=SuperCat) 

    def subcat_set(self): 
     return SubCat.query(SubCat.category == self.key) 

ध्यान दें कि यह एक विधि है; अजगर में, आप इसे कॉल करनी होगी:

for cat in categories: 
    for subcat in cat.subcat_set(): 
     ...blah... 

लेकिन एक टेम्पलेट में आप() कॉल वाक्य रचना बाहर छोड़ (चाहिए) कर सकते हैं, तो आप आप क्या चाहते हैं पाने:

{{ for cat in categories }} 
    {{ for subcat in cat.subcat_set }} 
     ...blah... 

यह एक दें प्रयत्न!

+2

काम करता है! लेकिन केवल टेम्पलेट में() के साथ। बिना() मुझे टाइप एरर मिलता है: 'instancemethod' ऑब्जेक्ट पुनरावर्तनीय नहीं है। –

+0

आप किस टेम्पलेट सिस्टम का उपयोग कर रहे हैं? मैंने सोचा कि Django ऑटो कॉल कॉलबेल। लेकिन शायद Jinja2 नहीं करता है? यदि आपको() पसंद नहीं है, तो आप @property (लोअरकेस 'पी', एक पायथन अंतर्निर्मित) के साथ विधि को सजाने के लिए कर सकते हैं। –

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