不使用数据库查询预取对象?

2024-09-30 00:30:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我从数据库中获取了多个具有预取关系的对象:

datei_logs = DateiLog.objects.filter(user=request.user)
                             .order_by("-pk")
                             .prefetch_related('transfer_logs')

transfer_logs是指:

^{pr2}$

现在我想得到所有状态为"Good"TransferLogs。但我想如果我这么做:

datei_logs[0].transfer_logs.filter(...)

它再次查询数据库!因为这发生在一个有很多日志条目的网站上,我最后有900个查询!在

我使用:

datei_logs[0].transfer_logs.count()

同样,它也会导致对数据库的大量查询!在

我该怎么做才能“只获取所有信息”,然后只查询一个包含所有信息的对象而不是数据库?在


Tags: 对象信息数据库byobjects关系requestorder
1条回答
网友
1楼 · 发布于 2024-09-30 00:30:06

由于您使用的是django1.7,所以可以使用新的^{}对象来指定要用于相关查找的查询集。在

queryset = TransferLog.objects.filter(status='Good')
datei_logs = DateiLog.objects.filter(user=request.user)
                             .order_by("-pk")
                             .prefetch_related(Prefetch('transfer_logs', 
                                                        queryset=queryset,
                                                        to_attr='good_logs'))

然后您可以访问datei_logs[0].good_logs并选中len(datei_logs[0].good_logs)。在

如果您对多个状态感兴趣,可以使用多个Prefetch对象。但是,如果您无论如何都要获取所有日志,那么最好还是坚持原来的查询,然后在Python中拆分日志,而不是调用filter()。在

相关问题 更多 >

    热门问题