В 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)