2012-06-20 9 views
6

He leído this question y la respuesta simple y clara pero no es útil en mi caso porque la respuesta no tiene en cuenta el for anidado. Por favor, vea el código:¿Cuál es la alternativa a la propiedad de referencia posterior en NDB?

class SuperCat(ndb.Model): 

class Category(ndb.Model): 
    supercat = ndb.KeyProperty(kind=SuperCat) 

class SubCat(ndb.Model): 
    category = ndb.KeyProperty(kind=Category) 

manejador:

Categories = ndb.gql("SELECT * FROM Category WHERE supercat = :1", supercat_key) 
self.generate('supercat.html', {'Categories': Categories}) 

en plantilla, con la vieja db.Model y la propiedad de nuevo referencia esto es suficiente:

{{ for Category in Categories }} 
    {{ for SubCat in Category.subcat_set }} # this is the back-reference in action 

¿Cuál es la alternativa igualmente simple para servir a dicha estructura de datos?

+0

parece que [Propiedades estructuradas] (https://developers.google.com/appengine/docs/python/ndb/properties#structured) es un buen punto de partida .. –

Respuesta

11

Veámoslo sistemáticamente. En primer lugar, la db->ndb translation guide nos dice que la consulta regresar casos SubCategoría para una instancia determinada categoría es la siguiente:.

subcats_query = SubCategory.query(SubCategory.category == cat.key) 

(Nótese que uso nombres en minúsculas para las instancias de entidades públicas y/CapWords para clases/modelos Así gato es una . Categoría entidad)

Así que en Python, que escribiría su doble bucle de la siguiente manera:

for cat in categories: 
    for subcat in SubCat.query(SubCat.category == cat.key): 
     ...blah... 

con el fin de convertir esto en algo que es fácilmente accesible desde la plantilla, vamos a definir un nuevo método en la categoría clase:

class Category(ndb.Model): 

    supercat = ndb.KeyProperty(kind=SuperCat) 

    def subcat_set(self): 
     return SubCat.query(SubCat.category == self.key) 

Tenga en cuenta que este es un método; en Python, lo que tiene que llamarlo:

for cat in categories: 
    for subcat in cat.subcat_set(): 
     ...blah... 

Pero en una plantilla que puede (debe) dejar de lado la sintaxis de llamada(), para que pueda obtener lo que quiere:

{{ for cat in categories }} 
    {{ for subcat in cat.subcat_set }} 
     ...blah... 

darle un ¡tratar!

+2

funciona! pero solo con() en plantilla. sin() obtengo un objeto TypeError: 'instanciametodo' no es iterable. –

+0

¿Qué sistema de plantilla estás usando? Creí que Django llamaba automáticamente a los callables. Pero tal vez Jinja2 no? Si no te gusta el(), puedes decorar el método con @property (minúscula 'p', un Python incorporado). –

Cuestiones relacionadas