Django: самый простой способ объединить все числовые данные в один набор запросов при выполнении алфавитной разбивки на страницы?

#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