Pregunta

Tengo este código para encontrar todos los nodos donde las ramas propiedad está vacía.

nobranches=TreeNode.all()

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

Yo quería encontrar una forma mejor y más eficiente de hacer esto. Un meathod donde yo no tengo que recuperar todos los TreeNodes. He tratado TreeNode.all (). Filtro (ramas = []), pero esto me da un mensaje, "BadValueError ( 'y filtros de listas no es compatible'". ¿Cómo puedo hacer algo como TreeNode.gql ( 'donde las ramas = .: 1' , []) fetch (100) he intentado esto, pero tengo una. 'BadValueError: no puede usar la lista vacía como un valor de la propiedad; propiedad es []' ¿hay alguna otra forma eficiente

Por cierto, aquí es lo que se ve como TreeNode

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

¿Fue útil?

Solución

La documentación sobre cómo se almacenan los índices dice:

  

Para las propiedades de varios valores, tales como ListProperty y StringListProperty, cada valor tiene su propia fila de índice, por lo que mediante las propiedades de varios valores resulta en más sobrecarga de indexación.

Así que para cada elemento de su propiedad lista, hay una fila en el índice.

Mi expectativa sería que si no hay artículos en la propiedad lista, entonces no habría ninguna fila en el índice. Por lo que no sería posible utilizar el índice para recuperar entidades con una lista vacía.

Una solución sería añadir otra propiedad (por ejemplo hasbranches = db.BooleanProperty()), que se mantiene al agregar o quitar las ramas. Entonces usted será capaz de filtro para hasbranches = False.

Otros consejos

No se puede hacer esto con un filtro:. Sajona como dice, no hay coincidencia fila de índice lo desea recuperar, y así no hay manera de recuperarlo

Una alternativa sencilla es almacenar otra propiedad que contiene el número de elementos en la lista, y el filtro de eso. aetycoon es una biblioteca que contiene propiedades calculadas que pueden ayudar con que:

class TreeNode(db.Model):
  name = db.StringProperty()
  branches = db.ListProperty(db.Key)
  branch_count = aetycoon.DerivedProperty(lambda self: len(self.branches))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top