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.

War es hilfreich?

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 []
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top