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.
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
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? –
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