Ich habe Mühe, mich im ORM des Django zurechtzufinden. Ich möchte eine Liste mit unterschiedlichen Werten in einem Feld in meiner Tabelle abrufen. Dies entspricht einem der folgenden Werte:
SELECT DISTINCT myfieldname FROM mytable
(oder alternativ)
SELECT myfieldname FROM mytable GROUP BY myfieldname
Ich würde es zumindest gerne auf Django-Art machen, bevor ich auf rohes SQL zurückgreife. Zum Beispiel mit einer Tabelle:
ID, Straße, Stadt
1, Hauptstraße, Rumpf
2, andere Straße, Rumpf
3, Bibble Way, Leicester
4, ein anderer Weg, Leicester
5, High Street, Londidium
Ich würde gerne bekommen:
Rumpf, Leicester, Londidium.
values_list
eine Liste nicht zurückgegeben wird. Es gibt so etwas wie ein Abfragesatz zurück. Ich fand es nützlich, list () immer um values_list-Aufrufe zu verwenden.values_list
Gibt ValuesListQuerySet zurück, das ein Iterator ist. Das Casting in eine Liste kann nützlich sein, kann aber auch die Leistung beeinträchtigen, wenn alle Zeilen gleichzeitig ausgewertet werden müssen, insbesondere bei großen Datenmengen.Meta: ordering = ()
"Merkmal" von Django Orm undobjects.distinct()
vs.objects.ordering().distinct()
verursachte uns stundenlange Verwirrung. Auf diesem Produkt sollte ein Warnaufkleber für die Verbrauchersicherheit angebracht sein;) Wir können eine Richtlinie für Nicht-Meta-Bestellattribute einführen, um künftig das Kratzen des Kopfes zu verhindern.Meta
Klasseordering
deaktivieren und Probleme mit lösen,distinct
indem Sieorder_by()
ohne Parameter verwenden. Es befindet sich in den QuerySet-API-Dokumenten unterorder_by()
" Wenn Sie nicht möchten, dass eine Reihenfolge auf eine Abfrage angewendet wird, nicht einmal die Standardreihenfolge, rufen Sieorder_by()
ohne Parameter auf. "Neben der immer noch sehr relevanten Antwort von jujule finde ich es sehr wichtig, sich auch der Auswirkungen
order_by()
aufdistinct("field_name")
Anfragen bewusst zu sein . Dies ist jedoch nur eine Postgres-Funktion!Wenn Sie Postgres verwenden und einen Feldnamen definieren, für den die Abfrage eindeutig sein soll,
order_by()
muss mit demselben Feldnamen (oder denselben Feldnamen) in derselben Reihenfolge begonnen werden (möglicherweise sind danach weitere Felder vorhanden).Wenn Sie z. B. eine Liste von Städten extrahieren möchten, in denen Sie Geschäfte kennen, müsste das Beispiel für Jujule daran angepasst werden:
quelle
Zum Beispiel:
quelle