我有一些领域的模型,例如:
class Foo(models.Model):
date = models.DateTimeField()
related = models.ForeignKey(Related)
...
我想创建一个报告,其中包含开始日期和结束日期,并总结每个日期的记录总数 + 每个日期的每个相关值的记录数。
--- 编辑 1 ---- 示例:假设我在 Foo 中有以下记录:
[date, related, ...]
[3-3-13, val1, ...]
[3-3-13, val1, ...]
[3-3-13, val2, ...]
[3-4-13, val1, ...]
[3-4-13, val3, ...]
[3-4-13, val3, ...]
[3-4-13, val3, ...]
我想得到:
3-3-13: total=3, val1=2, val2=1
3-4-13: total=4, val1=1, val3=3
--- 编辑 1 结束 ----
我希望这能有效地减少对 Dbase 的影响。我打算在 Dbase 上点击 2 次:
- 在所需日期提取所有 Foo 对象
- 与#1 中的记录相关的所有相关对象一旦我在内存中有这些对象,我认为我根本不需要点击 Dbase。
我尝试了以下方法:
objects = Foo.objects.filter(date__gte=start).values_list('date','related') # Dbase query 1
objects = objects.filter(date__lte=end)
related_list = objects.values_list('related',flat=True)
rel_objects = Related.objects.filter(id__in=related_list) # Dbase query 2
cur_date = start
while cur_date <= end:
cur_obj = objects.filter(date__startswith=cur_date)
cur_related = rel_objects.filter(id__in=cur_obj.values_list('related'))
for r in cur_related:
count = len(cur_obj.values('related').filter(related=r))
...
问题是我每次进入内部循环时都会看到对 Dbase 的命中(对于 cur_related 中的 r)。
另外-我一直在更改 values_list 并且我不确定如何更有效地做到这一点。