2009-10-03 4 views
1

Je ne sais pas comment faire un GqlQuery qui commande par une propriété de ReferenceProperty.GqlQuery OrderBy une propriété dans ReferenceProperty

Dans ce cas, je veux tout le siège, mais commande par l'id de la salle

La référence GqlQuery ne permet pas une jointure, comment abordez-vous dans ce cas?

class Room(db.Model): 
    id = db.IntegerProperty() 
    dimension = db.StringProperty(multiline=True) 

une salle a beaucoup de sièges, chacun avec un id

class Seat(db.Model): 
    id = db.IntegerProperty() 
    roomId = db.ReferenceProperty(Room) 



seats_query = GqlQuery("SELECT * FROM Seat ") 
seats = seats_query.fetch(1000) 

Alex est juste à son point, alors j'ai décidé de ne pas toucher GqlQuery, et a essayé de jouer avec le modèle Django à la place, je trouvé la solution pour trier Seat par Room'id sans avoir à ajouter un nouveau champ dans la classe Seat.

Je mets le code ici si quelqu'un a des intérêts;));) Vive)

 {% regroup seats|dictsort:"roomId.id" by roomId.id as room_list %} 
     <ul> 
     {% for room in room_list %} 
      <li>Room: {{room.grouper}} 
      <ul> 
      {% for item in room.list %} 
      <li>Seat no: {{item.id}} </li> 
      {% endfor %} 
      </ul> 
      </li> 
      {% endfor %} 
     </ul> 

Répondre

0

En général, pour contourner le manque BDs non relationnel de REJOIGNEZ fonctionnalité, vous dénormaliser; Plus précisément, vous placez les pièces de données en plusieurs endroits de façon redondante, ce qui rend la mise à jour de votre magasin plus difficile, mais les bases de données non relationnelles en général sont fortement orientées vers la lecture. applications).

Dans ce cas, vous ajoutez à Seat une propriété avec l'id de la pièce - puisque vous avez particulièrement appelé roomId (plutôt que, disons, room) la référence à la salle du siège, je suppose que vous auriez cette bit dénormalisé comme roomIdId.

+0

omg, cela signifie que je n'ai pas solution pour commander le siège par ID de la salle sans ajouter de données supplémentaires à mes modèles: -s Que faire si vous avez déjà des tonnes de données dans votre base de données? –

+0

@Hoang, vous pouvez ajouter un champ à tous les sièges existants, N à la fois, par exemple, une place de sièges par groupe devrait être bien (utiliser des files d'attente de tâches). En général, vous ne pouvez commander que par champs que vous avez - c'est une limitation clé des DB non relationnelles (en échange de l'évolutivité, etc.). –

+0

Salut Alex, j'ai modifié la question avec réponse en utilisant le modèle Django pour résoudre mon problème;) Salutations;) –

0

Je pense que dans le cas où il vous fonctionnera comme vous voulez:

class Seat(db.Model): 
    id = db.IntegerProperty() 
    roomId = db.ReferenceProperty(Room,collection_name='seats') 

Et après que vous pouvez utiliser quelque chose comme ceci:

rooms = Room.all().order('id') 
for room in rooms: 
    seat_at_room = room.seats.order('id') 
Questions connexes