Domanda

Ho questo codice per trovare tutti i nodi in cui rami proprietà è vuota.

nobranches=TreeNode.all()

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

ho voluto trovare un modo migliore e più efficace per farlo. Un meathod dove non c'è bisogno di recuperare tutti TreeNodes. Ho provato TreeNode.all (). Filtro (rami = []), ma questo mi dà un messaggio, "BadValueError ( 'filtraggio sulle liste non è supportato'". Come posso fare qualcosa di simile TreeNode.gql ( 'dove i rami = .: 1' , []) fetch (100) ho provato a farlo, ma ottengo una. 'BadValueError: maggio non usa la lista vuota come un valore di proprietà, la proprietà è []' c'è un altro modo efficace

A proposito, ecco cosa TreeNode assomiglia

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

È stato utile?

Soluzione

La documentazione su come indici sono memorizzati dice:

  

Per multivalore proprietà, come ListProperty e StringListProperty, ogni valore ha la propria riga di indice, in modo da utilizzare le proprietà multivalore fa risultati più indicizzazione ambientale.

Quindi, per ogni elemento nella vostra proprietà lista, c'è una fila nell'indice.

La mia speranza sarebbe che se non ci sono elementi nella proprietà lista, allora non ci sarebbero righe dell'indice. Quindi non sarebbe possibile utilizzare l'indice per recuperare le entità con una lista vuota.

Una soluzione sarebbe quella di aggiungere un'altra proprietà (ad esempio hasbranches = db.BooleanProperty()), che si mantiene quando si aggiungono o rimuovono i rami. Allora si sarà in grado di filtro per hasbranches = False.

Altri suggerimenti

Non si può fare questo con un filtro:. Come dice sassone, non c'è corrispondenza riga di indice ciò che si desidera recuperare, e quindi non c'è modo di recuperare lo

Una semplice alternativa è quella di memorizzare un'altra proprietà che contiene il numero di elementi nella lista, e il filtro su questo. aetycoon è una libreria che contiene le proprietà calcolate che possono aiutare con questo:

class TreeNode(db.Model):
  name = db.StringProperty()
  branches = db.ListProperty(db.Key)
  branch_count = aetycoon.DerivedProperty(lambda self: len(self.branches))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top