Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
过滤某些结果时,Django查询集上的Count vs len_Django_Django Models - Fatal编程技术网

过滤某些结果时,Django查询集上的Count vs len

过滤某些结果时,Django查询集上的Count vs len,django,django-models,Django,Django Models,比克已经提出了我的问题的更一般的版本: 不过,我的情况有点不同。它是这样开始的: messages = Message.objects.filter(foo=bar) 要获取错误消息\u计数和其他消息\u计数,哪个更好 error_message_count = len(message for message in messages if message.is_error) other_message_count = len(messages) - error_message_count e

比克已经提出了我的问题的更一般的版本:

不过,我的情况有点不同。它是这样开始的:

messages = Message.objects.filter(foo=bar)
要获取
错误消息\u计数
其他消息\u计数
,哪个更好

error_message_count = len(message for message in messages if message.is_error)
other_message_count = len(messages) - error_message_count
error_message_count = len(message for message in messages if message.is_error)
other_message_count = len(messages) - error_message_count
或:

甚至:

error_message_count = messages.filter(is_error = True).count()
other_message_count = messages.filter(is_error = False).count()
我怀疑第一个解决方案归结为只有一个查询,而其他的则分为两个查询。但也许Django和/或DBMS会使后两个系统中的一个更高效


我接受“profile it”作为答案,但我想知道这些解决方案中是否有任何一个被认为是最佳实践。

据我所知,如果检索所有对象并逐个检查布尔值,这不是一个好方法,因为您使用的是使用内存的python。 另一方面,“count”在数据库中执行,只检查一个布尔值不必获取所有行。因此,我认为好的方法是中间的方法

error_message_count = messages.filter(is_error = True).count()
other_message_count = messages.count() - error_message_count

另外,当您定义“messages”时,它是一个queryset,但在需要它之前,它不会在数据库中执行,因为它使用惰性计算。因此,如果对该查询集使用for循环,它将直接执行它。但是,如果为所需的布尔值添加另一个过滤器,它将只更新数据库查询。这就是为什么它的性能更好。

据我所知,如果检索所有对象并逐个检查布尔值,这不是一个好方法,因为使用使用内存的python来实现。 另一方面,“count”在数据库中执行,只检查一个布尔值不必获取所有行。因此,我认为好的方法是中间的方法

error_message_count = messages.filter(is_error = True).count()
other_message_count = messages.count() - error_message_count

另外,当您定义“messages”时,它是一个queryset,但在需要它之前,它不会在数据库中执行,因为它使用惰性计算。因此,如果对该查询集使用for循环,它将直接执行它。但是,如果为所需的布尔值添加另一个过滤器,它将只更新数据库查询。这就是性能更好的原因。

要在以下两者之间做出选择:

或:


有一些重要的因素需要考虑,例如,您是否有
is_error
的索引,
消息的大小是多少,以及您希望有多少
+ve
/
-ve
匹配项。不幸的是,
profile it
确实会给你一个清晰的画面。如果表的大小很小(例如,几千个条目,这无关紧要)。如果它有数百万条条目,那么用一个配置文件来获得清晰的图片应该是相当容易的

要在这两者之间做出选择:

或:


有一些重要的因素需要考虑,例如,您是否有
is_error
的索引,
消息的大小是多少,以及您希望有多少
+ve
/
-ve
匹配项。不幸的是,
profile it
确实会给你一个清晰的画面。如果表的大小很小(例如,几千个条目,这无关紧要)。如果它有数百万条条目,那么用一个配置文件来获得清晰的图片应该是相当容易的

您是在事后使用这些请求的消息,还是只想获得两个号码,仅此而已?原始筛选列表中预计有多少条消息(上万条)?列表中的预期错误率是多少?好问题,但我实际上不确定答案。这些数字表示页面顶部的状态图标;用户可以单击它查看消息,也可以忽略它。我不确定消息的数量,但如果有几十条以上的消息,我会感到惊讶(因此在我的例子中,这个问题更多的是关于风格而不是性能,但是有人可能有一天会对一个非常不同的应用程序提出同样的问题)。我也不确定出错的比例;用户希望它非常小,但实际上这取决于第三方数据的质量。您是在事后使用这些请求的消息,还是只想得到两个数字,仅此而已?原始筛选列表中预计有多少条消息(上万条)?列表中的预期错误率是多少?好问题,但我实际上不确定答案。这些数字表示页面顶部的状态图标;用户可以单击它查看消息,也可以忽略它。我不确定消息的数量,但如果有几十条以上的消息,我会感到惊讶(因此在我的例子中,这个问题更多的是关于风格而不是性能,但是有人可能有一天会对一个非常不同的应用程序提出同样的问题)。我也不确定出错的比例;用户希望它非常小,但它实际上取决于第三方数据的质量。我非常确定这三种方法中的任何一种都会导致两个查询。我希望在创建
messages
对象时执行查询,并在该对象的生命周期内缓存结果。(如果生成器函数为每次迭代重新执行查询,我会对Django感到惊讶和失望!)但我认为您是对的,希望DB服务器能够比客户端上的代码更有效地过滤错误。谢谢。它不会每次迭代都执行查询。但最重要的是,若你们能在数据库中完成,那个么就在那个里完成。如果没有办法,那么考虑拉所有的信息并迭代它。因此,执行count函数使用数据库中的count,执行速度非常快。祝您有愉快的一天:)我非常确定这三个方法中的任何一个都会导致两个查询。我希望在创建
messages
对象时执行查询,并在该对象的生命周期内缓存结果。(如果生成器函数为每次迭代重新执行查询,我会对Django感到惊讶和失望!)但我认为您是对的,希望DB服务器能够比客户端上的代码更有效地过滤错误。谢谢。它不会对每个站点执行查询
error_message_count = messages.filter(is_error = True).count()
other_message_count = messages.count() - error_message_count