2016-04-11 5 views
1

Ich habe eine Liste von Produkten mit einem Feld namens "Titel" und ich habe versucht, eine Liste der Anfangsbuchstaben mit wenig Glück zu bekommen. Die Schlüsse, die ich habe, sind die folgenden, die nicht funktionieren, da 'Distinct' nicht funktioniert.Produkt-Index mit Django ORM

atoz = Product.objects.all().only('title').extra(select={'letter': "UPPER(SUBSTR(title,1,1))"}).distinct('letter') 

ich irgendwo falsch gehen muss, Ich hoffe mir kann jemand helfen.

Antwort

0

Sie können es in Python erhalten, nachdem die queryset in bekam, die trivial ist:

products = Project.objects.values_list('title', flat=True).distinct() 
atoz = set([i[0] for i in products]) 

Wenn Sie MySQL verwenden, fand ich another answer useful, wenn auch mit Hilfe von SQL (django execute sql directly):

SELECT DISTINCT LEFT(title, 1) FROM product; 
+0

Ja die SQL ist genau das, was ich will ABER in der Django ORM wenn möglich. –

+0

Mir ist nichts bekannt, das in ORM existiert, das 'LEFT' substring Funktion in mysql implementiert. Vielleicht gibt es einen anderen Weg, es zu tun? –

0

Die beste Antwort, die ich mir vorstellen konnte, die nicht 100% ideal ist, da es eine Nachbearbeitung erfordert, ist dies.

atoz = sorted(set(Product.objects.all().extra(select={'letter': "UPPER(SUBSTR(title,1,1))"}).values_list('letter', flat=True)))