2009-01-15 11 views
5

Estoy usando el motor de la aplicación de Google, y tengo problemas para escribir querys para filtrar ReferenceProperties.Filtrado de modelos con ReferenceProperties

por ejemplo.

class Group(db.Model): 
    name = db.StringProperty(required=True) 
    creator = db.ReferenceProperty(User) 

class GroupMember(db.Model): 
    group = db.ReferenceProperty(Group) 
    user = db.ReferenceProperty(User) 

Y he tratado de escribir algo como esto:

members = models.GroupMember.all().filter('group.name =', group_name) 

y varias otras cosas que no funcionan. Con suerte, alguien me puede dar un golpe en la dirección correcta ...

Respuesta

4

Si lo que desea es obtener los miembros de un grupo, ReferenceProperties tiene eso incorporado.

class GroupMember(db.Model): 
    group = db.ReferenceProperty(Group, collection_name="groupMembers") 
    user = db.ReferenceProperty(User, collection_name="groupMembers") 

entonces usted puede escribir:

# get the group entity somehow 
group = Group.get(group_key)  
# do something with the members, such as list the nicknames 
nicknames = [x.user.nickname for x in group.groupMembers] 
1

Esto requeriría una unión, que no es posible en App Engine. Si desea filtrar por una propiedad de otro modelo, debe incluir esa propiedad en el modelo que está consultando.

1

Esto daría como resultado dos visitas al almacén de datos, pero debería funcionar. Si usa Memcache no debería ser un problema.

group = models.Group.all().filter("name =", group_name).get() 
members = models.GroupMember.all().filter('group =', group) 
5

Si sus grupos tienen un nombre único, entonces su "group.name" es un identificador único de una entidad de grupo.

Eso significa que se puede escribir:

members = models.GroupMember.all().filter(
    "group =",model.Group.gql("WHERE name=:1", group_name).get() 
    ) 

pesar de que sólo tiene que hacer que si usted no tiene ya la entidad del grupo por ahí en algún lugar de la pila.

El ensayo de Google sobre many-to-many con appengine es here.

0

utilizando los modelos que se han definido en su pregunta, digamos que usted desea listar todos los miembros de un grupo llamado "monos espaciales".

mygroup = Group.gql("WHERE name = :1",'Space monkeys') 

for group_member in mygroup.groupmember_set: 
    print 'group members name is: %s' % (group_member.user.name) 

El "groupmember_set" se llama una "propiedad de colección implícita" y es muy útil. Puede llamarlo como lo desee anulando el nombre predeterminado mediante el parámetro de palabra clave collection_name en ReferenceProperty. Para ver un ejemplo, consulte la respuesta al Thomas L Holaday.

Todo esto se explica en un muy buen documento de Rafe Kapla: Modeling Entity Relationships.