0

我有一些领域的模型,例如:

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 次:

  1. 在所需日期提取所有 Foo 对象
  2. 与#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 并且我不确定如何更有效地做到这一点。

4

2 回答 2

1

型号说明

class Foo(models.Model):
  post_date = models.DateTimeField()
  related = models.ForeignKey(Related)

related_info = Foo.objects.filter(post_date__get=start_date, \
    post_date__lte = end_date).extra(select = {'temp_date':'date(post_date)'}). \
    values('temp_date').annotate(count = Count('related'))


#related_info is [('post_date','related_count'),...]
于 2013-05-23T12:56:50.387 回答
0

您可以使用Q 对象

有了这个定义

class Foo(models.Model):
  date = models.DateTimeField()
  related = models.ForeignKey(Related, related_name="foos")

#1)
objects = Foo.objects.filter(Q(date__gte=start) & Q(date__lte=end))

#2)
related = Related.objects.filter(foos__in=objects)
count = related.count()

请测试它并告诉我。

于 2013-05-23T12:21:07.230 回答