Jestem ciekawy, czy istnieje sposób na wykonanie zapytania w Django, które nie jest „ SELECT * FROM...
” poniżej. SELECT DISTINCT columnName FROM ...
Zamiast tego próbuję wykonać „ ”.
Konkretnie mam model, który wygląda następująco:
class ProductOrder(models.Model):
Product = models.CharField(max_length=20, promary_key=True)
Category = models.CharField(max_length=30)
Rank = models.IntegerField()
gdzie Rank
jest rangą w ramach Category
. Chciałbym móc iterować po wszystkich kategoriach, wykonując pewne operacje na każdej pozycji w tej kategorii.
Chciałbym najpierw uzyskać listę wszystkich kategorii w systemie, a następnie zapytać o wszystkie produkty w tej kategorii i powtarzać, aż każda kategoria zostanie przetworzona.
Wolałbym unikać surowego SQL, ale jeśli będę musiał tam iść, to będzie w porządku. Chociaż nigdy wcześniej nie kodowałem surowego SQL w Django / Pythonie.
To całkiem proste, jeśli używasz PostgreSQL , po prostu użyj
distinct(columns)
( dokumentacja ).Productorder.objects.all().distinct('category')
Zauważ, że ta funkcja została zawarta w Django od 1.4
źródło
can_distinct_on_fields
wydaje się być tylko Postgresemall()
nie jest tutaj koniecznePozostałe odpowiedzi są w porządku, ale jest to trochę czystsze, ponieważ podaje tylko wartości takie, jakie można uzyskać z zapytania DISTINCT, bez żadnego cruft z Django.
>>> set(ProductOrder.objects.values_list('category', flat=True)) {u'category1', u'category2', u'category3', u'category4'}
lub
>>> list(set(ProductOrder.objects.values_list('category', flat=True))) [u'category1', u'category2', u'category3', u'category4']
I działa bez PostgreSQL.
Jest to mniej wydajne niż użycie .distinct (), zakładając, że DISTINCT w twojej bazie danych jest szybszy niż python
set
, ale świetnie nadaje się do makaronu wokół powłoki.źródło
values_list
nie umieszczaDISTINCT
w zapytaniu sql, więc przyniosłoby to wiele wartości, gdyby istniały.Sortuj użytkowników według tego pola, a następnie rozróżnij.
ProductOrder.objects.order_by('category').values_list('category', flat=True).distinct()
źródło