gpt4 book ai didi

python - 在不使用数据库的情况下查询预取对象?

转载 作者:太空狗 更新时间:2023-10-30 03:01:11 26 4
gpt4 key购买 nike

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

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

现在我想获取所有状态为"Good"TransferLogs。但我认为如果我这样做:

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

它再次查询数据库!由于这种情况发生在一个有很多日志条目的网站上,我最终得到了 900 个查询!

我使用:

datei_logs[0].transfer_logs.count()

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

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

最佳答案

由于您使用的是 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()

关于python - 在不使用数据库的情况下查询预取对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26366729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com