2009-08-18 5 views
0

Wenn ich zwei Tabellen habe, Unternehmen und Vertrieb, und möchte ich beide Datensätze in einer einzigen Liste anzeigen, wie würde ich dies in Google App Engine mit GQL tun?Auf Google AppEngine, was ist der beste Weg, um zwei Tabellen zusammenzuführen?

Die Modelle sind:


class Company(db.Model): 

    companyname = db.StringProperty()   
    companyid = db.StringProperty() 
    salesperson = db.StringProperty() 

class Sales(db.Model): 

    companyid = db.StringProperty() 

    weeklysales = db.StringProperty() 

    monthlysales = db.StringProperty() 

Die Ansichten sind:


def company(request): 
    companys = db.GqlQuery("SELECT * FROM Company") 
    sales = db.GqlQuery("SELECT * FROM Sales") 
    template_values = { 
    'companys' : companys, 
    'sales' : sales 
    } 
    return respond(request, 'list', template_values) 

Liste html enthält:


{%for company in companys%} 
    {% for sale in sales %}  
    {% ifequal company.companyid sales.companyid %} 

    {{sales.weeklysales}} 
    {{sales.monthlysales}} 

    {% endifequal %} 
    {% endfor %} 

      {{company.companyname}} 
      {{company.companyid}} 
      {{company.salesperson}} 

{%endfor%} 

Jede Hilfe wäre sehr dankbar.

Antwort

0

Sie sollten eine ReferenceProperty in Ihrem Verkaufsmodell verwenden:

company = db.ReferenceProperty(Company)

Ein Beispiel dafür, wie durch den Verkauf für ein Unternehmen iterieren:

company = db.GqlQuery("SELECT * FROM Company").fetch(1)[0] 
for sale in company.sales_set: 
    #Do something ... 
+1

Seien Sie gewarnt, dass dies viel mehr Abfragen erstellt (1 plus eins pro Firma, anstatt 2 insgesamt). Es ist wahrscheinlich, dass es viel mehr Datenspeicheranfragen machen wird. Wenn die Anzahl der "Verkauf" -Objekte bei der Iteration eines Abfrageobjekts ungefähr der natürlichen Anforderungsgröße entspricht, macht das wenig Unterschied, aber ich bezweifle, dass damit gerechnet werden kann. –

+1

Nicht mehr Abfragen, sondern mehr Datenspeichervorgänge. Das Auflösen einer Referenzeigenschaft erfordert eine Datenspeicherung, die viel billiger ist als eine Abfrage. –

+1

Danke für die Klarstellung - die Dokumentation für Referenzeigenschaften sagt, "jede referenzierte Entität erhält eine Eigenschaft, deren Wert eine Abfrage ist, die alle Entitäten zurückgibt, die darauf verweisen". Also verteidige ich meine Behauptung, dass es mehr Abfragen erzeugt (d. H. Abfrageobjekte), und ich sage "Datenspeicheranforderungen", wenn ich "Datenspeicheroperationen" meine. Welche Art von Datenspeicheroperation, die Abfrageobjekt bei der Verwendung ausgibt, überlasse ich dem Experten :-) –

0
{%for company in companys%} 
    {% for sale in sales %}  
    {% ifequal company.companyid sales.companyid %} 

dass Code ist problematisch. Wenn Sie 200 Firmen und 1000 Verkäufe haben, werden Sie die ifequal-Anweisung 200000 Mal ausführen!

Im Allgemeinen, wenn Sie mehr als 1000 Verkäufe oder Unternehmen haben, wird dies überhaupt nicht funktionieren, da Sie nur 1000 Elemente gleichzeitig aus dem Datenspeicher abrufen können. (und wenn Sie nicht planen, mehr als 1000 Artikel zu haben, ist die App-Engine wahrscheinlich zu viel für Ihr Projekt)

Ich denke, Ihr erstes Ziel sollte sein, herauszufinden, wie Sie Ihre Liste in Seiten brechen wollen. Möchten Sie 50 Verkäufe pro Seite anzeigen? oder vielleicht 10 Firmen pro Seite, zusammen mit allen ihren jeweiligen Verkäufen? Sobald Sie sich dazu entschieden haben, können Sie nur die Informationen abfragen, die Sie benötigen.

+0

Ich versuche über 800 Unternehmen mit 800 Verkäufen zurückzuziehen, es gibt eine 1: 1 Beziehung zwischen einem Verkauf und einem Unternehmen. Ich denke, hier ist das Problem :-) Jede zusätzliche Hilfe wäre großartig. – gpjones

+1

Möchten Sie Ihrem Benutzer wirklich 1600 Artikel auf einmal zeigen? Werden sie in der Lage sein, ihnen einen Sinn zu geben? –

1

Sie haben in einem Kommentar gesagt, dass es eine 1-1 Beziehung zwischen Verkauf und Unternehmen gibt. So können Sie die Daten in der gleichen Reihenfolge erhalten:

def company(request): 
    companys = db.GqlQuery("SELECT * FROM Company ORDER BY companyid").fetch(1000) 
    sales = db.GqlQuery("SELECT * FROM Sales ORDER BY companyid").fetch(1000) 
    template_values = { 
    'companys' : companys, 
    'sales' : sales 
    } 
    return respond(request, 'list', template_values) 

{%for company in companys%} 
    {{sales[forloop.counter0].weeklysales}} 
    {{sales[forloop.counter0].monthlysales}} 

    {{company.companyname}} 
    {{company.companyid}} 
    {{company.salesperson}} 
{%endfor%} 

Das ist immer noch keine gute Lösung. Wenn Sie sicher sind, dass die 1-1-Beziehung korrekt ist, würde ich nur eine einzige Entität haben, die alle Informationen enthält. Wenn Sie nichts anderes tun, müssen Sie sich keine Gedanken über Datenbankinkonsistenzen machen, wenn Sie eine Firma erstellen, aber Ihr Versuch, die entsprechende Verkaufsdateneinheit zu erstellen, schlägt aus irgendeinem Grund fehl.

Verwandte Themen