Django错误:列表索引超出范围(当没有对象时)

6za6bjd0  于 2022-12-01  发布在  Go
关注(0)|答案(3)|浏览(137)

在我删除所有对象并尝试触发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}
hs1rzwqc

hs1rzwqc1#

您还可以执行以下操作:

ticket = Ticket.objects.filter(customer=customer).order_by("-id").first() or None

而不是:

ticket = Ticket.objects.filter(customer=customer).order_by("-id")[0]
jc3wubiy

jc3wubiy2#

您不应该获取票证列表并访问一行中的第一个元素,而是应该首先获取列表,然后检查它是否为空,然后获取第一个元素。

zpf6vheq

zpf6vheq3#

而不是这样:

ticket = Ticket.objects.filter(customer=customer).order_by("-id")[0]

如果DB中存在任何对象,则使用exists()来使用此方法,这是一种非常有效的方法:

tickets = Ticket.objects.filter(customer=customer).order_by("-id")
if tickets.exists():
   ticket = tickets.first()
else:
   ticket = None

更新

您可以在筛选函数中进行查询。

tickets = Ticket.objects.filter(customer=customer, date_posted__lte=timezone.now().date() - timedelta(hours=24))

context = {"check_time": tickets.exists()}

相关问题