2016-07-12 4 views
4

Situation

Ich habe die folgende Abfrage in Postgres 9.5.Wie schreibe ich eine Update-Postgres-Abfrage als Abfragesatz in Django 1.9?

update warehouse_shelf 
    set package_count = counter.result 
from (
    select count(id) as result, shelf_id 
    from warehouse_package 
    group by shelf_id 
) counter 
where counter.shelf_id = warehouse_shelf.id; 

Dies sind meine Tabellen.

warehouse_shelf 
+----+------+---------------+ 
| ID | NAME | PACKAGE_COUNT | 
+----+------+---------------+ 
| 1 | S1 |    3 | 
| 2 | S2 |    1 | 
| 3 | S3 |    0 | 
+----+------+---------------+ 

warehouse_package 
+----+------+---------------+ 
| ID | NAME | SHELF_ID  | 
+----+------+---------------+ 
| 1 | P1 |    1 | 
| 2 | P2 |    1 | 
| 3 | P3 |    1 | 
| 4 | P4 |    2 | 
+----+------+---------------+ 

Frage

Wie führe ich die Abfrage über, wenn ich eine Änderung an einem einzelnen Paket zu machen (zum Beispiel speichern, löschen, erstellen, aktualisieren usw.) über django-Modell?

Ich möchte, wenn möglich mit Django-Abfrage-Set ausführen und vermeiden, es als unbearbeitete Abfrage auszuführen.

Antwort

0

Betrachtet man Modelle und ihre Fremdschlüsselbeziehungen:

from django.db.models import Count 

shelves = WhShelf.objects.all()  

for shelf in shelves: 
     count = WhPackage.objects.filter(shelf_id=shelf.id).aggregate(Count('shelf')) 
     shelf.update(package_count=count[shelf__count']) 

Alterantively, können Sie eine einzelne Abfrage:

WhShelf.objects.annotate(package_count=WhPackage.objects. 
       filter(shelf_id=shelf.id).aggregate(Count('shelf'))['shelf__count']) 
+0

Schauen Sie auch bei https://docs.djangoproject.com/en /1.9/topics/db/queries/ und https://docs.djangoproject.com/en/1.9/ref/models/querysets/ für Aggregate – dmitryro

+0

Ihre Methode wird aufgrund einer Schleife für die Regale mehrere Abfragen ausführen. Gibt es eine Möglichkeit, alle Regale package_count in einer einzigen Django-Abfrage zu aktualisieren? –

+0

WhPackage.objects.filter (shelf_id = shelf.id) .aggregate (Count ('Shelf')) gibt Ihnen ein Dictionary zurück, mit dem Sie in der verschachtelten Abfrage nach shelf__count-Werten suchen und auf package_count setzen können. Weitere Informationen finden Sie unter https://docs.djangoproject.com/en/1.9/topics/db/aggregation/ – dmitryro