standard - google app engine python versions
Lista de referencias en Google App Engine para Python (2)
Paso uno:
Use db.ListProperty (db.Key) para crear la relación. Desea que ListProp esté en la entidad que tendrá menos referencias en la relación de muchos a muchos. Esto también le dará una referencia de nuevo. Asi que:
class Spam
prop1 = db.String
eggs = db.List
class Eggs
prop1 = db.string
@property
def spams(self):
return Spam.all().filter(''eggs'', self.key())
Esto proporciona una referencia en ambos sentidos.
Segundo paso:
Crea un método de utilidad que elimine las propiedades.
def prefetch_refprops(entities, *props):
"""Dereference Reference Properties to reduce Gets. See:
http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engine
"""
fields = [(entity, prop) for entity in entities for prop in props]
ref_keys = [prop.get_value_for_datastore(x) for x, prop in fields]
ref_entities = dict((x.key(), x) for x in db.get(set(ref_keys)))
for (entity, prop), ref_key in zip(fields, ref_keys):
prop.__set__(entity, ref_entities[ref_key])
return entities
El uso sería:
derefrenced_spams = prefetch_refprops(Spams, models.Spam.eggs)
En Google App Engine, existe una propiedad de lista que le permite mantener una lista (matriz) de elementos. También puede especificar el tipo de elemento que se retiene, por ejemplo, cadena, entero o lo que sea.
Google App Engine también te permite tener una propiedad de referencia. Una propiedad de referencia "contiene" una referencia a otra entidad del modelo de Google App Engine. Si accede a una propiedad de referencia, recuperará automáticamente la entidad real a la que apunta la referencia. Esto es conveniente, ya que es mejor que obtener la clave y luego obtener la entidad para dicha clave.
Sin embargo, no veo nada como ListReferenceProperty (o ReferenceListProperty). Me gustaría tener una lista de referencias a otras entidades, que se resolvería automáticamente cuando intento acceder a los elementos dentro de la lista. Lo más cercano que puedo conseguir es que parece contener una lista de objetos db.Key. Puedo usar estas claves para luego recuperar manualmente sus entidades asociadas del servidor.
¿Hay alguna buena solución para esto? Básicamente, me gustaría tener la posibilidad de tener una colección de referencias (auto-dereferencing) a otras entidades. Casi puedo llegar al tener una colección de claves para otras entidades, pero me gustaría "saber" que estos son elementos clave y que podría hacer referencia a ellos como un servicio para mí.
Gracias
Tienes razón, no hay construido en ReferenceListProperty
. Sería posible escribir uno por sí mismo: las subclases de propiedades personalizadas son generalmente bastante fáciles, pero hacer las cosas bien es más difícil de lo que parece, cuando se trata de diferir y almacenar en caché una lista de referencias.
Sin embargo, puede usar un db.ListProperty(db.Key)
que le permite almacenar una lista de claves. Luego, puede cargarlos individualmente o todos a la vez utilizando una db.get()
lotes db.get()
. Esto requiere que hagas el paso de resolución tú mismo, pero también te da más control sobre cuándo desreferir entidades.