Ошибка Django: индекс списка вне диапазона (когда нет объектов)
Все работает нормально, пока я не удалю все объекты и не попытаюсь вызвать url, тогда он выдает мне это traceback: list index out of range
. Я не могу использовать get
, потому что может быть более одного объекта, а использование [0]
с filter
приводит к этой ошибке, когда нет ни одного объекта, есть ли способ обойти это? Я пытаюсь получить недавно созданный объект модели Ticket (если он создан) и затем выполнить логику, так что если у клиента нет никаких билетов, ничего не происходит, но если у клиента есть, то логика выполняется
Модели
class Ticket(models.Model):
date_posted = models.DateField(auto_now_add=True, blank=True, null=True)
customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, blank=True, null=True)
Виды
try:
ticket = Ticket.objects.filter(customer=customer).order_by("-id")[0]
now = datetime.now().date()
set_date = ticket.date_posted
check_time = now - set_date <= timedelta(hours=24)
if check_time:
print('working')
else:
print('not working')
except Ticket.DoesNotExist:
ticket = None
context = {"check_time": check_time}
Вместо получения списка билетов и доступа к первому элементу в одной строке, вы должны сначала получить список, затем проверить, что он не пуст, а затем получить первый элемент.
Вместо этого:
ticket = Ticket.objects.filter(customer=customer).order_by("-id")[0]
Используйте это, используя exists()
, что является очень эффективным способом, если в БД существует какой-либо объект:
tickets = Ticket.objects.filter(customer=customer).order_by("-id")
if tickets.exists():
ticket = tickets.first()
else:
ticket = None
Вы также можете сделать следующее:
ticket = Ticket.objects.filter(customer=customer).order_by("-id").first() or None
вместо:
ticket = Ticket.objects.filter(customer=customer).order_by("-id")[0]