【发布时间】:2016-09-26 20:55:30
【问题描述】:
已经提出了我的问题的更一般版本:Count vs len on a Django QuerySet
不过,我的情况有点不同。开头是这样的:
messages = Message.objects.filter(foo=bar)
获取error_message_count和other_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.count() - 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”作为答案,但我想知道这些解决方案是否被认为是最佳实践。
【问题讨论】:
-
您是在之后使用那些请求的消息,还是只想获得两个数字,仅此而已?原始过滤列表中预计有多少消息(数十、数千)?列表中的预期错误率是多少?
-
好问题,但我实际上不确定答案。这些数字用于页面顶部的状态图标;用户可以点击它来查看消息,或者忽略它。我不确定消息的数量,但如果有几十条消息,我会感到惊讶(所以在我的情况下,这个问题更多的是关于风格而不是性能,但有人可能对一个非常不同的问题有同样的问题某天申请)。我也不确定错误的比例;用户希望它非常小,但这实际上取决于第三方数据的质量。
标签: django django-models