Abrufen von eindeutiger Datensätze basierend auf einer Spalte auf Django
Muss ich eine Liste mit Datensätzen abzurufen, die für die folgende Tabelle mit unterschiedlichen Werten in Bezug auf-name:
Class C:
name value
A ------------------ 10
A ------------------ 20
A ------------------ 20
B ------------------ 50
C ------------------ 20
D ------------------ 10
B ------------------ 10
A ------------------ 30
Brauche ich, um loszuwerden, alle die doppelten Werte für den Namen und nur zeigen Sie das folgende:
name value
A ------------------ 30
B ------------------ 10
C ------------------ 20
D ------------------ 10
Wie Sie sehen können, es sieht fast aus, wie ein python set. Ich kann wahrscheinlich generieren, das set mit Python, aber ich Frage mich, ob Djangos ORM hat diese Funktion.
Ich habe versucht, mit verschiedenen, aber es nicht akzeptieren ein argument angeben, welche Spalte hat, haben unterschiedliche Werte. Irgendeine Idee, wie man diese Abfrage funktioniert?
- Willst du einfach nur den ersten Wert für jeden Namen, oder was?
- Entweder den ersten, oder letzten.
- Auch du solltest dir eines aussuchen, da die ersten und letzten Werte unterschiedlich sind. Wollen Sie wirklich willkürliche Zufälligkeit?
- Muss ich eigentlich erst den letzten Wert. Aber für dieses Beispiel setze ich den ersten als ich dachte, da gibt es keinen Unterschied.
Du musst angemeldet sein, um einen Kommentar abzugeben.
.distinct()
ist das tool, aber hier ist die syntax, die ich hatte, zu verwenden :Diese Weise erhalten Sie nur eine Liste [A,B,C,D] von Werten, nicht die Objekte selbst.
Problem mit sqlite ausgeprägt ist es distincts auf alle zurückgegebenen Werte. Distinct auf eine Spalte Namen, zum Beispiel: 'url', um alle einzigartigen urls aus einer Tabelle, aber auch die restlichen Daten, die eine Unterabfrage verwenden.
Die Unterabfrage wird die IDs der url ' s und dann verwendet, die für eine weitere Abfrage auf diese Ideen. Dies ist nicht so schnell wie eine reguläre unterschiedliche natürlich.
(Zu der Zeit die bisherigen Antworten, wo gegeben, django nicht Unterabfrage Funktionalität noch nicht.)
Können Sie auch roh wie:
queryraw = C.objects.raw('SELECT name, value FROM prj_c GROUP BY name')
oder fügen Sie eine ORDER BY, um die höheren Wert für jede Gruppe:
queryraw = C.objects.raw('SELECT name, value FROM prj_c GROUP BY name ORDER BY value')
In jedem Fall können Sie
list()
von Objekten.Nützliche Dokumentation hier: https://docs.djangoproject.com/en/2.0/topics/db/sql/
Dies ist nicht super elegant, aber es bekommt den job getan, in etwa eine Linie:
Dies ruft das vollständige Modell-Instanz für jede der Werte, die Sie tun, die UNTERSCHEIDBAR. Einige Anwendungsfälle benötigen möglicherweise unterschiedliche Filterung.
Dann verwenden Sie einfach die
name
undvalue
Eigenschaften in jedem Punkt aufitem_list
um Ihre unterschiedliche Daten.Mithilfe der folgenden syntax sollte Ihr problem lösen.
values('name', 'Wert').distinct()