首页 > 解决方案 > get_object_or_404 上的循环在条件失败后停止

问题描述

我正在尝试从基于另一个模型的模型中提取对象:

代码

def financials (request):
    finance = list(Quiz.objects.filter(owner=request.user.pk).values_list('id', flat=True))
    print('finance', finance)
    invoice_list = []

    for i in finance:
        print('i',i)

        invoice_object = get_object_or_404(Invoice, invoice_quiz_id=i)
        invoice_list.append(invoice_object)

但它在一个循环后停止,因为它确实符合条件,任何帮助表示赞赏。

这是我尝试过的:

invoice_object = [get_object_or_404(Invoice, invoice_quiz_id=i) for i in finance]

如果它匹配错误条件,这个循环怎么会停止?如何让它继续失败的条件?

标签: pythondjango

解决方案


如果它匹配错误条件,这个循环怎么会停止?如何让它继续失败的条件?

get_object_or_404(..)[Django-doc]的想法就像文档说的那样:

调用get()给定的模型管理器,但它引发Http404而不是模型的DoesNotExist异常

因此,根据设计,如果不存在此类对象或存在多个对象,它将引发错误。如果您不希望这样,您可能想要使用.first()or.filter(..)代替。

话虽如此,如果您只对引用 a的Invoice对象感兴趣,则可以定义如下查询集:invoice_quizQuizowner request.user

invoices = Invoice.objects.filter(invoice_quiz__owner=request.user)

这不仅更优雅,而且更高效,因为您将JOIN在数据库端创建一些 s,从而Invoice在单个查询中获取所有对象,而不是在N+1 个查询中获取NQuiz个ze的数量。


推荐阅读