我从我的数据库获取具有预取关系的多个对象:
datei_logs = DateiLog.objects.filter(user=request.user)
.order_by("-pk")
.prefetch_related('transfer_logs')
transfer_logs
指的是:
class TransferLog(models.Model):
datei_log = models.ForeignKey("DateiLog", related_name="transfer_logs")
status = models.CharField(
max_length=1,
choices=LOG_STATUS_CHOICES,
default='Good'
)
server_name = models.CharField(max_length=100, blank=True, default="(no server)")
server = models.ForeignKey('Server')
class Meta:
verbose_name_plural = "Transfer-Logs"
def __unicode__(self):
return self.server_name
现在我希望获得状态为TransferLogs
的所有"Good"
。但我想如果我这样做:
datei_logs[0].transfer_logs.filter(...)
它再次查询数据库!由于这发生在一个包含许多日志条目的网站上,我最终会得到900个查询!
我用:
datei_logs[0].transfer_logs.count()
同样也会导致对db进行大量查询!
我能做些什么才能获得所有东西"然后只查询包含所有信息的对象而不是db?
答案 0 :(得分:4)
由于您使用的是Django 1.7,因此您可以使用新的Prefetch()
对象来指定要用于相关查找的查询集。
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()
。