Ошибка 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]
Вернуться на верх