【问题标题】:Django queryset filter performanceDjango 查询集过滤器性能
【发布时间】:2017-02-13 11:54:02
【问题描述】:

我有一个查询集:-

queryset = my_object.someobject_set.all()

从那里开始,我想从查询集中进行过滤。即:

print queryset.filter(name='some1').exists()
print queryset.filter(name='some2').exists()
print queryset.filter(name='some3').exists()

但是对于每个过滤器查询,都会再次命中数据库。如何缓存查询集然后从中过滤?

我什至尝试在过滤之前评估查询集:-

print len(queryset)

但这不起作用。 有什么帮助吗??

【问题讨论】:

  • 或者您的意思是这是 3 个不同的查询?
  • 是的,我的意思是 3 个不同的查询
  • 然后在示例中修复您的代码
  • 已经完成。请再次检查。
  • 查看更新的答案

标签: django performance django-models django-queryset django-cache


【解决方案1】:

使用 django ORM 是不可能的。但是你可以在 python 中做到这一点。

queryset = list(my_object.someobject_set.all())

print list(filter(lambda i: i.name == 'some1', queryset))
print list(filter(lambda i: i.name == 'some2', queryset))
print list(filter(lambda i: i.name == 'some3', queryset))

这样你就不会做任何额外的数据库命中。但是,如果这个查询集真的比使用 ORM 更好,即使它命中 db。自己计时,看看哪个更快

【讨论】:

  • 无需将所有列提取到内存中。请改用only
  • @itzmeontv 我不确定他只是想检查值是否存在。但是,是的,如果只需要检查only 就可以了。
  • 你怎么看?循环遍历列表并检查对 db 的字段与“存在”查询?根据您的知识回答? :)
  • @itzmeontv 你在问一般吗?
  • 是的,有时我在想exist 比循环更好。
猜你喜欢
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 2020-08-22
  • 2019-04-15
  • 2011-09-29
相关资源
最近更新 更多