我有大量数据,通常大约有2000多个条目,但在本报告中,我们可以查看我们想要的内容,因此最多可以有10,000条记录
报告分为:两个类别,然后在每个类别中,我们按货币分割,因此我们在列表中有几个子类别。
我的问题在于有效地计算各种小计。我正在使用Django并将模板标签传递给货币和类别(如果适用),然后templatetag呈现总计。请注意,有时我只为该类别设置了一个小计,没有通过货币。
最初,如果有像这样的货币/类别,我只使用.filter()对每个小计使用单独的查询:
if currency:
entries = entries.filter(item_currency=currency)
这成了一个问题,因为我会有太多的查询,并且生成时间太长(2000+ ms),所以我选择使用list(条目)来立即执行我的查询,然后循环执行它具有简单的列表推导:
totals['quantity'] = sum([e.quantity for e in entries])
如果你还没有看到我的问题,那就在于......我怎样才能有效地在每个列表理解中添加货币/类别的条件?有时他们不会在那里,有时他们会这样,我不能简单地输入:
totals['quantity'] = sum([e.quantity for e in entries if item_currency = currency])
我可以创建一个巨大的if-block,但这不是很干净并且是一个维护灾难,所以我正在向Stackoverflow社区寻求一些洞察力...提前感谢:)
答案 0 :(得分:6)
您可以定义一个小内联函数:
def EntryMatches(e):
if use_currency and not (e.currency == currency):
return False
if use_category and not (e.category == category):
return False
return True
然后
totals['quantity'] = sum([e.quantity for e in entries if EntryMatches(e)])
EntryMatches()可以访问封闭范围内的所有变量,因此无需再传入任何参数。你可以获得所有使用条目的逻辑在一个地方的优势,你仍然可以使用列表推导使sum()更具可读性,但你现在可以在EntryMatches()中拥有任意逻辑。