gqlquery لعدم وجود قيم في ListProperty
-
29-09-2019 - |
سؤال
لدي هذا الرمز للعثور على جميع العقد حيث تكون فروع الممتلكات فارغة.
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))