python - 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]
如果它匹配错误条件,这个循环怎么会停止?如何让它继续失败的条件?
解决方案
如果它匹配错误条件,这个循环怎么会停止?如何让它继续失败的条件?
get_object_or_404(..)
[Django-doc]的想法就像文档说的那样:
调用
get()
给定的模型管理器,但它引发Http404
而不是模型的DoesNotExist
异常。
因此,根据设计,如果不存在此类对象或存在多个对象,它将引发错误。如果您不希望这样,您可能想要使用.first()
or.filter(..)
代替。
话虽如此,如果您只对引用 a的Invoice
对象感兴趣,则可以定义如下查询集:invoice_quiz
Quiz
owner
request.user
invoices = Invoice.objects.filter(invoice_quiz__owner=request.user)
这不仅更优雅,而且更高效,因为您将JOIN
在数据库端创建一些 s,从而Invoice
在单个查询中获取所有对象,而不是在N+1 个查询中获取NQuiz
个ze的数量。
推荐阅读
- android - 在 Kotlin 的资产文件夹中读取文件
- android-emulator - 抗锯齿似乎在 Android 模拟器中不起作用
- lua - lua:全局变量与表条目变量
- sockets - TCPSteam 包组合多个包
- android - 尝试运行 jetpack compose 仪器测试时如何克服此构建错误
- c++ - 我应该使用迭代器而不是基于范围的循环,如果是,为什么?
- java - 在java中的屏障线程之间共享局部变量值
- react-native - 显示表 react-native-table-component 时出现未定义的 device.map 错误
- javascript - 前端安全 - 是否可以限制访问范围?
- java - 基于 akka 流的套接字客户端/服务器测试在 MacOS 上获得“对等连接重置”,但在 Linux 上没有:哪些限制很重要?