2012-01-28 19 views
5

Creo que estoy perdiendo la cabeza, ¿por qué no hago el siguiente trabajo?App Engine agregando elementos a ListProperty

class Parent(db.Model): 
    childrenKeys = db.ListProperty(str,indexed=False,default=None) 

p = Parent.get_or_insert(key_name='somekey') 
p.childrenKeys = p.childrenKeys.append('newchildkey') 
p.put() 

me sale este error:

BadValueError: Property childrenKeys is required 

El doctor dice:

default is the default value for the list property. If None, the default is an empty list. A list property can define a custom validator to disallow the empty list.

Así que la forma en que lo veo, me estoy poniendo el valor predeterminado (una lista vacía) y añadiendo un nuevo valor y el ahorro.

+0

es probable que desee un 'StringListProperty' en lugar de' ListProperty (str) ', en cualquier caso. (Aunque si esto funciona para usted, algo puede haber cambiado en un SDK reciente que los hace equivalentes). – geoffspear

Respuesta

8

debe quitar la asignación p.childrenKeys:

class Parent(db.Model): 
    childrenKeys = db.ListProperty(str,indexed=False,default=[]) 

p = Parent.get_or_insert('somekey') 
p.childrenKeys.append('newchkey') 
p.put() 
5

Reemplazar esta:

p.childrenKeys = p.childrenKeys.append('newchildkey') 

con esto:

p.childrenKeys.append('newchildkey') 

append() vuelve None, que no puede ser asignado a p.childrenKeys .

+0

¿No se supone que debe devolver una lista vacía como dice el documento? No puede ser que la lista vacía en Python sea equivalente a None, ¿o sí? – ofko

+2

p.childrenKeys devuelve una lista vacía. p.childrenKeys.append() devuelve None, porque ese es el comportamiento del método append() de una lista. El problema aquí fue la asignación de None a p.childrenKeys, que no está permitido por ListProperty. (Puede asignar la lista vacía a ListProperty, que dentro del almacén de datos se representa sin tener propiedades de ese nombre.) –

+0

ok gracias por explicar eso, lo entiendo ahora. – ofko