#django #django-queryset
#django #django-queryset
Вопрос:
Я пытаюсь отсортировать результаты запроса по алфавитным разделам, вот так:
Это работает со следующим кодом:
def get_context(self, request):
# Get published shows, ordered alphabetically
context = super().get_context(request)
shows = ShowPage.objects.child_of(self).live().order_by("name")
context["pages"] = [{"letter" : i,
"shows" : shows.filter(name__istartswith=i.upper())}
for i in "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"]
return context
Следующий шаг — объединить все шоу, которые начинаются с любого числа, в одну группу с пометкой «0-9».
Следующее делает то, что я хочу, но оно ужасно подробное, и мне интересно, есть ли более простой способ, о котором я просто не знаю:
def get_context(self, request):
# Get published shows, ordered alphabetically
context = super().get_context(request)
shows = ShowPage.objects.child_of(self).live().order_by("name")
pages = [{"letter" : i,
"shows" : shows.filter(name__istartswith=i.upper())}
for i in "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"]
digits = {"letter" : "0 - 9", "shows" : []}
for index, alphabet in enumerate(pages):
if alphabet["letter"].isdigit():
for show in alphabet["shows"]:
digits["shows"] = [show]
while pages[0]["letter"].isdigit():
print(pages[0])
pages.pop(0)
pages.insert(0, digits)
context["pages"] = pages
return context
Есть идеи?
Ответ №1:
Просто наберите одну строку регулярного выражения в поле поиска, чтобы увидеть, начинается ли строка имени с цифры. Также istartswith
не чувствителен к регистру, поэтому вам не нужен i.upper()
.
def get_context(self, request):
# Get published shows, ordered alphabetically
context = super().get_context(request)
shows = ShowPage.objects.child_of(self).live().order_by("name")
context['pages'] = [{'letter': shows.filter(name__istartswith=letter)} for letter in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ']
context['pages'].append({'letter': '0-9', 'shows': shows.filter(name__regex=r'^d[wd _-] '})
return context