Frage

Ich habe diesen Code alle Knoten zu finden, wo die Immobilien Filialen leer.

nobranches=TreeNode.all()

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

Ich wollte eine bessere, effizientere Art und Weise finden, dies zu tun. Ein meathod wo ich nicht alle TreeNodes abzurufen. Ich habe versucht, TreeNode.all (). Filter (Zweige = []), aber das gibt mir eine Nachricht, „BadValueError (‚Filtern auf Listen werden nicht unterstützt.‘“ Wie kann ich so etwas wie TreeNode.gql tun ( 'WHERE Zweige = .: 1' , []) (100) hole ich dies versucht, aber ich bekommen. ‚BadValueError: nicht Mai die leere Liste als Eigenschaftswert verwenden; Eigenschaft ist []‘ gibt es eine andere effiziente Art und Weise.

BTW, Hier ist, was TreeNode sieht aus wie

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

War es hilfreich?

Lösung

Die Dokumentation auf, wie Indizes gespeichert werden sagt:

  

Für mehrwertige Eigenschaften, wie Listproperty und StringListProperty, jeder Wert einen eigenen Index Reihe hat, so mit mehrwertig Eigenschaften führt in mehr Indizierungsaufwand.

So für jedes Element in der Liste Eigenschaft, gibt es eine Reihe im Index.

Meine Erwartung wäre, dass, wenn es keine Elemente in der Liste Eigenschaft sind, dann gäbe es keine Zeilen im Index sein. So ist es nicht Entitäten mit einer leeren Liste abzurufen wäre möglich, den Index zu verwenden.

Eine Lösung wäre, eine andere Eigenschaft hinzufügen (zB hasbranches = db.BooleanProperty()), die Sie erhalten, wenn Sie Zweige hinzufügen oder entfernen. Dann werden Sie zum Filter der Lage sein, für hasbranches = False.

Andere Tipps

Sie können nicht dies tun, mit einem Filter. Wie Saxon sagt, es gibt keine Indexzeile Matching, was Sie abrufen möchten, und so keine Möglichkeit, es abzurufen

Eine einfache Alternative ist eine andere Eigenschaft zu speichern, die die Anzahl der Elemente in der Liste enthält, und Filter darauf. aetycoon ist eine Bibliothek, die berechneten Eigenschaften enthält, die dabei helfen können:

class TreeNode(db.Model):
  name = db.StringProperty()
  branches = db.ListProperty(db.Key)
  branch_count = aetycoon.DerivedProperty(lambda self: len(self.branches))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top