ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 不使用db查询预取对象?

2019-06-24 08:43:25  阅读:192  来源: 互联网

标签:python django django-1-7


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

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”的所有TransferLog.但我想如果我这样做:

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

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

我用:

datei_logs[0].transfer_logs.count()

同样,它也会导致很多对db的查询!

我可以做什么来“只获得一切”,然后只查询包含所有信息而不是数据库的对象?

解决方法:

由于您使用的是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,django,django-1-7
来源: https://codeday.me/bug/20190624/1276959.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有