سؤال

لدي هذا الرمز للعثور على جميع العقد حيث تكون فروع الممتلكات فارغة.

nobranches=TreeNode.all()

for tree in nobranches:
 if tree.branches==[]:

أردت أن أجد طريقة أفضل وأكثر كفاءة للقيام بذلك. meathod حيث لا يتعين علي استرداد جميع treenodes. لقد جربت treenode.all (). التصفية (الفروع = []) ولكن هذا يعطيني رسالة ، "badvalueerror ('التصفية في القوائم غير مدعومة". كيف يمكنني فعل شيء مثل treenode.gql ("حيث الفروع = : 1 '، []).

راجع للشغل ، إليك ما يبدو عليه Treenode

class TreeNode(db.Model):
  name = db.StringProperty()
  branches =db.ListProperty(db.Key)

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

المحلول

ال وثائق حول كيفية تخزين الفهارس يقول:

بالنسبة للخصائص المتعددة القيم ، مثل ListProperty و StringListProperty ، فإن كل قيمة لها صف الفهرس الخاص بها ، وبالتالي فإن استخدام الخصائص متعددة القيم يؤدي إلى مزيد من النفقات العامة للفهرسة.

لذلك لكل عنصر في خاصية القائمة الخاصة بك ، يوجد صف في الفهرس.

سيكون توقعاتي أنه إذا لم يكن هناك عناصر في خاصية القائمة ، فلن يكون هناك صفوف في الفهرس. لذلك لن يكون من الممكن استخدام الفهرس لاسترداد الكيانات بقائمة فارغة.

سيكون حل واحد هو إضافة خاصية أخرى (على سبيل المثال hasbranches = db.BooleanProperty()) ، والتي تحافظ عليها عند إضافة أو إزالة الفروع. بعد ذلك ، ستتمكن من تصفية hasbranches = false.

نصائح أخرى

لا يمكنك القيام بذلك باستخدام مرشح: كما يقول سكسون ، لا يوجد صف فهرس يطابق ما تريد استرداده ، وبالتالي لا توجد طريقة لاسترداده.

أحد البديل البسيط هو تخزين خاصية أخرى تحتوي على عدد العناصر الموجودة في القائمة ، والتصفية على ذلك. aetycoon هي مكتبة تحتوي على خصائص محسوبة قد تساعد في ذلك:

class TreeNode(db.Model):
  name = db.StringProperty()
  branches = db.ListProperty(db.Key)
  branch_count = aetycoon.DerivedProperty(lambda self: len(self.branches))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top