В Django как получить соответствующий ключ для значения, переданного через url?

Вот мой models.py:

SHOW = (
    (0,"Ballers"),
    (1,"Silicon-Valley")
)

class Show(models.Model):
    show = models.IntegerField(choices=SHOW, blank=True, null=True)

Вот из моего urls.py:

urlpatterns = [
    path('<str:show>/', views.ShowList.as_view(), name='show-list'),
]

Я хочу, чтобы url выглядел следующим образом: https://www.mywebsite.com/ballers, но когда я пытаюсь запустить его, я получаю эту ошибку: Поле 'show' ожидало число, но получило 'ballers'. Я знаю, что могу исправить это, вызвав url https://www.mywebsite.com/0, но я не хочу, чтобы url выглядел так.

В Django он принимает первый аргумент как значение для передачи в db (поле), так что в основном с:

return Show.objects.filter(show=self.kwargs['show'])

он пытается искать непосредственно с передачей значения. С точки зрения БД она знает ТОЛЬКО целые числа. Поэтому вместо прямого поиска попробуйте сделать небольшое изменение:

class ShowList(generic.ListView):
    def get_queryset(self):
        show_string = self.kwargs['show']
        show_int = [show[0] for show in Show.SHOW if show[1].lower() == show_string.lower()][0]
        return Show.objects.filter(show=show_int)

а также перемещать варианты внутри модели:

class Show(models.Model):
    SHOW = (
        (0,"Ballers"),
        (1,"Silicon-Valley")
    )
    show = models.IntegerField(choices=SHOW, blank=True, null=True)
Вернуться на верх