Z komentarzem w drugiej odpowiedzi:
I faktycznie szuka sposobu, aby wdrożyć Group By First Character w django orm
Chciałbym zrobić to w 3 następujących czynności:
Opisuj każdy rekord pierwszą literą pola name
. W tym celu można użyć Substr
funkcję wraz z Lower
from django.db.models.functions import Substr, Lower
qs = User.objects.annotate(fl_name=Lower(Substr('name', 1, 1)))
Następnie grupa wszystkie rekordy z pierwszej litery i uzyskać liczbę identyfikatorów. Można to zrobić za pomocą annotate with values:
# 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'))
Następnie można zamówić queryset z pierwszego listu:
qs = qs.order_by('fl_name')
łącząc wszystkie te w jednym stwierdzeniem:
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')
Na e nd, twój queryset wyglądałby tak. Zauważ, że podczas pisania adnotacji konwertowałem pierwszy znak na małe litery. Jeśli nie musisz, że można usunąć Lower
funkcję:
[{'fl_name': 'a', 'cnt_users': 12},
{'fl_name': 'b', 'cnt_users': 4},
...
...
{'fl_name': 'z', 'cnt_users': 3},]
jeśli trzeba słownika pisma i liczyć:
fl_count = dict(qs.values('fl_name', 'cnt_users'))
# {'a': 12, 'b': 4, ........., 'z': 3}
Ok, więc w jaki sposób możemy pomóc? –
@MosesKoledoye Muszę zoptymalizować to i może zrobić to za pomocą pojedynczej kwerendy używając funkcji 'values ()' – samix73
Ta grupa nie ma sensu? Jeśli grupujesz według pierwszej litery nazwiska każdego użytkownika, dostaniesz 26 rekordów, to czego szukasz? – e4c5