Wählen Sie verschiedene Werte aus einem Tabellenfeld
-
20-09-2019 - |
Frage
Ich kämpfe meinen Kopf immer um die ORM Django. Was ich tun möchte, ist eine Liste der unterschiedlichen Werte innerhalb eines Feldes auf meinem Tisch bekommen .... das Äquivalent von einem der folgenden:
SELECT DISTINCT myfieldname FROM mytable
(oder alternativ)
SELECT myfieldname FROM mytable GROUP BY myfieldname
würde ich zumindest, wie es den Django Weg zu tun, bevor um rohe SQL greifen zu müssen. Zum Beispiel mit einer Tabelle:
id, Straße, Stadt
1, Main Street, Hull
2, Andere Street, Hull
3, Bibble Way, Leicester
4, Another Way, Leicester
5, High Street, Londidium
Ich möchte bekommen:
Hull, Leicester, Londidium.
Lösung
Sagen Sie Ihr Modell ist 'Shop'
class Shop(models.Model):
street = models.CharField(max_length=150)
city = models.CharField(max_length=150)
# some of your models may have explicit ordering
class Meta:
ordering = ('city')
Da Sie die Meta
Klasse ordering
-Attribut gesetzt haben, können Sie order_by()
ohne Parameter verwenden, jede Bestellung zu löschen, wenn distinct()
verwenden. Lesen Sie die Dokumentation unter order_by
()
Wenn Sie nicht möchten, dass jede Bestellung auf eine Abfrage angewendet werden, nicht einmal die Standard-Bestellung, Anruf order_by () ohne Parameter.
und distinct()
in der Notiz, wo es behandelt Fragen bei der Verwendung von distinct()
mit der Bestellung.
Zur Abfrage Ihrer DB, die Sie gerade anrufen müssen:
models.Shop.objects.order_by().values('city').distinct()
Es gibt eine Dictionnary
oder
models.Shop.objects.order_by().values_list('city').distinct()
Diese kehrt man ein ValuesListQuerySet
, die Sie zu einem list
werfen können.
Sie können auch flat=True
zu values_list
hinzufügen, um die Ergebnisse zu glätten.
Siehe auch: Get verschiedene Werte von Queryset durch Feld
Andere Tipps
Neben der immer noch sehr relevant Antwort von jujule , finde ich es ganz wichtig, auch die Auswirkungen bewusst sein, von order_by()
auf distinct("field_name")
Abfragen. Dies ist jedoch ein Postgres nur Feature!
Wenn Sie Postgres verwenden, und wenn Sie einen Feldnamen definieren, dass die Abfrage sollte deutlich sein, dann order_by()
Bedürfnisse mit dem gleichen Feldnamen (oder Feldnamen) zu beginnen, in der gleichen Reihenfolge (es kann mehrere Felder werden später) .
Hinweis
Wenn Sie Feldnamen angeben, müssen Sie eine order_by () in der zur Verfügung stellen QuerySet und die Felder in order_by () müssen mit den Feldern beginnen in distinct (), in der gleichen Reihenfolge.
Zum Beispiel SELECT DISTINCT ON (a) gibt die erste Zeile für jeden Wert in Spalte a. Wenn Sie nicht eine Bestellung angeben, erhalten Sie einige beliebige Zeile.
Wenn Sie eine Liste der Städte zu E-g- Extrakt mögen, dass Sie wissen, Geschäfte in dem Beispiel von jujule müßte dies angepasst werden:
# returns an iterable Queryset of cities.
models.Shop.objects.order_by('city').values_list('city', flat=True).distinct('city')
Mit dem Beispiel:
# select distinct code from Platform where id in ( select platform__id from Build where product=p)
pl_ids = Build.objects.values('platform__id').filter(product=p)
platforms = Platform.objects.values_list('code', flat=True).filter(id__in=pl_ids).distinct('code')
platforms = list(platforms) if platforms else []