2016-05-11 5 views
1

Ich habe mehrere Abfragesätze, die effektiv kombiniert werden müssen. Alle Abfragesätze haben das gemeinsame Feld key und ich möchte die Abfrageergebnisse durch den Wert verketten. ZB:Wie mehrere Abfragegruppen nach Schlüssel gemeinsam zu kombinieren?

some_query = SomeObject.objects.values('key').annotate(sum_0=Sum('some_value_field')) 
other_query = OtherObject.objects.values('key', 'other_field').annotate(sum_1=Sum('some_other_value_field')) 

Was ich habe:

[{'key': 1, 'sum_0': 10}, {'key': 2, 'sum_0': 20}, ...] 
[{'key': 1, 'sum_1': 1000}, {'key': 2, 'sum_1': 200}, ...] 

Was ich will:

[{'key': 1, 'sum_0': 10, 'sum_1': 100}, {'key': 2, 'sum_0': 20, 'sum_1': 200}, ...] 

ich diese Methode bin mit dicts kombinieren:

d = defaultdict(dict) 
for item in [some_query, other_query]: 
    for elem in item: 
     d[elem['key']].update(elem) 
combined = d.values() 

Gibt es mehr effektiver Weg, um das andere als Wörterbuch mich zu erreichen rge durch Iterieren durch jedes Abfrage-Set oder vielleicht gibt es eine Möglichkeit, diese Abfrage-Sets von key zu einem Ergebnis in der Abfrage selbst zu kombinieren?

+1

AFAIK Sie können Daten aus verschiedenen Tabellen nicht mit Django ORM/pure SQL kombinieren. –

+0

@MaximeLorant danke für die Antwort, wusste das nicht. – Dambre

Antwort

0

können Sie die Anmerkungen kombinieren, um nur ein db-Vorgang durch:

SomeObject.objects.values('key', 'other_field').annotate(sum_0=Sum('some_value_field'), sum_1=Sum('some_other_field')) 
+0

Das ist nicht was ich will. Ich möchte Abfrageergebnisse nach einem gemeinsamen Schlüssel abbilden. Wird die Frage in Sekundenschnelle bearbeiten. – Dambre

+0

Ich habe die Beschreibung geändert, als ob es zwei verschiedene Abfragen wäre, aber das gleiche Schlüsselfeld hat. Ich mappe jetzt, indem ich durch diese Wörterbücher iteriere, aber ich möchte etwas mehr Phantasie/effektiv machen (vielleicht auf der DB-Seite). – Dambre

+1

Ah ich sehe. Wenn es keine Beziehung zwischen den Objekten gibt, halte ich das nicht für möglich. – ilse2005

0

itertools.chain meine bevorzugte Art und Weise, aber Anmerkungen arbeiten können.

+0

hmm, ich brauche nicht nur alle abfragesätze zu einer liste hinzuzufügen, sondern dicts auch mit keys zu kombinieren. Ich habe die Methode aktualisiert, die jetzt verwendet wird. – Dambre

Verwandte Themen