我搜索的查询与this one非常相似。但作为一个扩展,我不想计算所有对象,而只是计算那些最近的对象。
就我而言,有两种型号。设一个为Source
,一个为Data
。结果,我想得到一个列表,列出了上周收集的数据记录数所排序的所有Source
。
对我来说,它不是迭代,总共收集了多少数据记录,但是如果该源的最近活动。
使用上面链接中的以下代码段,我无法在子查询之前了解Data
表。
from django.db.models import Count
activity_per_source = Source.objects.annotate(count_data_records=Count('Data')) \
.order_by('-count_data_records')
我提出的唯一方法是编写本机SQL或在循环和单个查询中处理它。有Django-Query版本吗?
(我使用MySQL数据库和Django 1.5.4)
答案 0 :(得分:1)
按照注释和过滤顺序检出文档:https://docs.djangoproject.com/en/1.5/topics/db/aggregation/#order-of-annotate-and-filter-clauses
尝试以下方面的内容:
activity_per_source = Source.objects.\
filter(data__date__gte=one_week_ago).\
annotate(count_data_records=Count('Data')).\
order_by('-count_data_records').distinct()
答案 1 :(得分:0)
有一种方法可以通过extra
:
start_date = datetime.date.today() - 7
activity_per_source = (
Source.objects
.extra(where=["(select max(date) from app_data where source_id=app_source.id) >= '%s'"
% start_date.strftime('%Y-%m-%d')])
.annotate(count_data_records=Count('Data'))
.order_by('-count_data_records'))
where
部分将根据Data
上次日期过滤来源。
注意:将表名和字段名替换为实际名称。