Von dem Kommentar in der anderen Antwort:
ich nach einem Weg suchte eigentlich Group By First Character zu implementieren in django
orm ich es in der folgenden drei Schritte tun würde:
Beschriften Sie jeden Datensatz mit dem ersten Buchstaben des Felds name
. Dafür könnten Sie Substr
Funktion zusammen mit Lower
from django.db.models.functions import Substr, Lower
qs = User.objects.annotate(fl_name=Lower(Substr('name', 1, 1)))
Als nächstes Gruppe alle Datensätze mit diesem Anfangsbuchstaben verwenden und die Anzahl der IDs erhalten. Dies kann durch Verwendung annotate with values erfolgen:
# since, we annotated each record we can use the first letter for grouping, and
# then get the count of ids for each group
from django.db.models import Count
qs = qs.values('fl_name').annotate(cnt_users=Count('id'))
Als nächstes Sie diese queryset mit dem ersten Buchstaben bestellen:
qs = qs.order_by('fl_name')
Die Kombination all diese in einer Aussage:
from django.db.models.functions import Substr, Lower
from django.db.models import Count
qs = User.objects \
.annotate(fl_name=Lower(Substr('name', 1, 1))) \
.values('fl_name') \
.annotate(cnt_users=Count('id')) \
.order_by('fl_name')
An der e nd, Ihr Anfrage-Set würde ungefähr so aussehen. Beachten Sie, dass ich das erste Zeichen beim Annotieren in Kleinbuchstaben umgewandelt habe. Wenn Sie nicht, dass benötigen, können Sie die Lower
Funktion entfernen:
[{'fl_name': 'a', 'cnt_users': 12},
{'fl_name': 'b', 'cnt_users': 4},
...
...
{'fl_name': 'z', 'cnt_users': 3},]
Wenn Sie ein Wörterbuch von Buchstaben benötigen und zählen:
fl_count = dict(qs.values('fl_name', 'cnt_users'))
# {'a': 12, 'b': 4, ........., 'z': 3}
Ok, so wie können wir helfen? –
@MosesKoledoye Ich muss dies optimieren und machen Sie es vielleicht eine einzige Abfrage mit 'values ()' Funktion – samix73
Diese Gruppe von macht keinen Sinn macht es? Wenn Sie nach dem ersten Buchstaben des Benutzernamens gruppieren, erhalten Sie nur 26 Datensätze. Ist das wonach Sie suchen? – e4c5