1

J'ai besoin de quelque chose exactement comme un SQL JOIN qui ne peut pas être fait avec appengine donc je suis à la recherche d'une solution de contournement. Ceci est la requête est triée par person.lastname voulezComment faire quelque chose comme un SQL JOIN avec appengine

downline = User.query(User.sponsor == distributor.key).fetch() 
for person in downline 
    orders = model.Order.all().filter('distributor_id =' , person.key.id()).filter('created >' , startdate).filter('status =', 'PAID').fetch(999999) 

La requête va chercher les commandes lieux par une personne et au fond, j'ai 2 types d'entités, les personnes et les commandes. Comment devrais-je imiter que je rejoins l'entité personnes (Utilisateur) et que je trie la liste par nom de famille? C'est une chose très facile à faire dans SQL et je ne pouvais pas trouver un moyen de le faire dans Appengine.

Pouvez-vous me dire comment ajouter les noms de personnes en mémoire? La fonction ne doit pas avoir de très bonnes performances car c'est une fonction de reporting. N'utilisez pas d'identifiants pour lier des modèles.

+0

duplication possible de [Besoin de commander par propriétés dans la propriété de référence, une bonne solution?] (Http://stackoverflow.com/questions/3333002/need-to-order-by-properties-in-the-reference -property-any-good-solution) –

+0

La réponse à cette question est dans la réponse à ma question précédente: http://stackoverflow.com/questions/8929943/modelling-in-google-datastore-use-lists-or- entités séparées –

Répondre

1

Vous pouvez connecter vos modèles Personne et Commande par rôle parental - une Personne est l'objet parent d'une Commande. Avec cela, il devient facile d'itérer sur l'ensemble de la personne dans l'ordre et de sélectionner ses ordres.

Une autre méthode consiste à utiliser une propriété ListPoperty si vous utilisez l'API actuelle ou des propriétés répétées si vous utilisez NDB pour lier votre commande à celle de votre personne.

1

C'est l'approche SQL; vous devez adopter une approche noSQL.

Au lieu de lier implicitement un Order avec un User avec un ID Partagée, la référence simplement User dans le Order.

class User(db.Model): 
    # ... 

class Order(db.Model): 
    distributor = db.ReferenceProperty(User) 
    # ... 

# e.g., 
order = Order() 
order.distributor = User() 

Ensuite, prenez vos utilisateurs, de les trier par order(), puis saisir tous associés Order s à l'aide filter() contre la User appropriée.

distributors = User.all().filter('sponser = ', sponser).order('lastname').fetch(i) 
for distributor in distributors: 
    orders = Order.all().filter('distributor', distributor).fetch(j) 
    # ... 
+0

C'est une bonne réponse mais j'ai dû lier les entités avec les ID puisque l'objet User est un modèle expando NDB. Je vais essayer de trouver d'autres moyens, mais c'était la seule façon d'obtenir une solution qui fonctionne un peu. –

-1

Si vraiment vous ne se soucient pas de la performance et cela est pour le travail de type reporting unique, vous voudrez peut-être envisager d'utiliser la api à distance.

Questions connexes