0

我搜索一个与这个非常相似的查询。但作为扩展,我不想计算所有对象,而只是计算那些相当近期的对象。

就我而言,有两个模型。让一个是那个Source,一个是那个Data。结果,我想获得一个Source按数据记录数排序的所有 s 列表,这些数据记录是在上周收集的。对我来说,总共收集了多少数据记录并不有趣,而是该来源最近是否有活动。

使用上面链接中的以下代码片段,我无法弥补之前如何对表进行子查询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 查询版本吗?

(我使用 MySQL 数据库和 Django 1.5.4)

4

2 回答 2

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()
于 2013-09-23T12:31:18.463 回答
0

有一种方法可以通过以下方式将 Django 查询与 SQL 混合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最后日期过滤源。

注意:用实际名称替换表和字段名称。

于 2013-09-23T15:22:46.540 回答