سؤال

لدي هرمية البيانات المخزنة في مخزن البيانات باستخدام نموذج الذي يبدو مثل هذا:

class ToolCategories(db.Model):  
   name = db.StringProperty()  
   parentKey = db.SelfReferenceProperty(collection_name="parent_category")  
   ...  
   ...  

أريد أن طباعة كل فئة أسماء الحفاظ على التسلسل الهرمي ، ويقول في بعض شكل مثل هذا :

--Information Gathering  
----OS Fingerprinting  
----DNS  
------dnstool  
----Port Scanning   
------windows  
--------nmap  
----DNS3  
----wireless sniffers  
------Windows  
--------Kismet  

للقيام أعلاه استخدمت بسيطة العودية باستخدام الرجوع القدرة:

class GetAllCategories (webapp.RequestHandler) :


        def RecurseList(self, object, breaks) :
                output = breaks + object.name + "</br>"
                for cat in object.parent_category:
                        output = output + self.RecurseList(cat, breaks + "--")

                return output



        def get (self) :
                output = ""
                allCategories = ToolCategories.all().filter(' parentKey = ', None)
                for category in allCategories :
                        output = output + self.RecurseList(category, "--")

                self.response.out.write(output)

كما أنا جديدة جدا التطبيق محرك البرمجة (بالكاد 3 أيام منذ أن بدأت كتابة التعليمات البرمجية), أنا لست متأكدا مما إذا كان ذلك الأمثل من مخزن البيانات الوصول إلى نظر للقيام الوظيفة المطلوبة.

هذا هو أفضل طريقة ؟ إن لم يكن ما هو ؟

هل كانت مفيدة؟

المحلول

لديك نهجا معقولا جدا!بلدي التحذير الرئيسي سيكون واحدا لا علاقة لها مع جي والكثير مع بيثون: لا بناء سلسلة من القطع مع + أو +=.بدلا من ذلك ، يمكنك تقديم قائمة من سلسلة قطع (مع append أو extend أو قائمة comprehensions &c) و عندما كنت فعلت كل ما يمكنك الانضمام إلى هذا النهائي السلسلة النتيجة مع ''.join(thelist) أو ما شابه ذلك.على الرغم الأخيرة إصدارات بيثون جاهدين لتحسين جوهريا O(N squared) أداء + أو += الحلقات, في النهاية انت دائما الأفضل بناء قوائم السلاسل على طول الطريق ، ''.joining لهم في النهاية!

نصائح أخرى

والعيب الرئيسي في نهجكم هو أن لأنك كنت تستخدم "قائمة الجوار" وسيلة لتمثيل الأشجار، ما عليك القيام به الاستعلام مخزن البيانات واحد لكل فرع من فروع الشجرة. استفسار مخزن البيانات غالية الثمن نسبيا (حوالي 160ms لكل منهما)، وذلك بناء على شجرة، وخاصة إذا كان كبير، يمكن أن تكون مكلفة نوعا ما).

وهناك نهج آخر، والتي هي في جوهرها واحد من مخزن البيانات التي اتخذت لتمثيل مجموعة كيان: بدلا من مجرد تخزين المفتاح الأصل، تخزين قائمة كاملة من أسلاف باستخدام ListProperty:

class ToolCategories(db.Model):
  name = db.StringProperty()
  parents = db.ListProperty(db.Key)

وبعد ذلك، لبناء شجرة، يمكنك استرداد شيء كامل في استعلام واحد:

q = ToolCategories.all().filter('parents =', root_key)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top