Question

Je le code pour trouver tous les noeuds où les branches de propriété est vide.

nobranches=TreeNode.all()

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

Je voulais trouver une meilleure façon de le faire plus efficace. Un meathod où je n'ai pas de récupérer toutes les TreeNodes. J'ai essayé filtre TreeNode.all (). (Branches = []), mais cela me donne un message, « BadValueError ( 'Filtrage sur les listes ne sont pas pris en charge ». Comment puis-je faire quelque chose comme TreeNode.gql (' où les branches = .: 1' , []) fetch (100) J'ai essayé, mais je reçois un. « BadValueError: ne pouvez pas utiliser la liste vide comme valeur de la propriété, la propriété est [] » est-il un autre moyen efficace

BTW, voici ce qui ressemble TreeNode Comme

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

Était-ce utile?

La solution

Le documentation sur la façon dont les index sont stockés dit:

  

Pour les propriétés à valeurs multiples, telles que ListProperty et StringListProperty, chaque valeur a sa propre ligne de l'index, en utilisant les propriétés à valeurs multiples a pour conséquence une surcharge plus d'indexation.

Donc, pour chaque élément de votre propriété de liste, il y a une ligne dans l'index.

Mon attente serait que s'il n'y a aucun élément dans la propriété de la liste, alors il n'y aurait pas de lignes dans l'index. Donc, il ne serait pas possible d'utiliser l'index pour récupérer des entités avec une liste vide.

Une solution serait d'ajouter une autre propriété (par exemple hasbranches = db.BooleanProperty()), que vous maintenez lorsque vous ajoutez ou supprimez des branches. Ensuite, vous serez en mesure de filtre pour hasbranches = False.

Autres conseils

Vous ne pouvez pas faire cela avec un filtre. Comme le dit Saxon, il n'y a pas de correspondance ligne d'index ce que vous voulez récupérer, et donc pas moyen de le récupérer

Une alternative simple est de stocker une autre propriété qui contient le nombre d'éléments dans la liste, et le filtre à ce sujet. aetycoon est une bibliothèque qui contient des propriétés calculées qui peuvent aider à cela:

class TreeNode(db.Model):
  name = db.StringProperty()
  branches = db.ListProperty(db.Key)
  branch_count = aetycoon.DerivedProperty(lambda self: len(self.branches))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top