0

私は2つのモデルを持っています:

class Source(models.Model):
    name = models.CharField(max_length=200)

class Data(models.Model):
    date = models.DateField(db_index=True)
    metric = models.IntegerField()
    source = models.ForeignKey(Source)

過去3日間にデータポイントがないすべてのソースを見つけたいと思います。PostgreSQLでは、これは実行可能です。

select influence_source.src, max(influence_data.date) as max_date
from influence_data, influence_source
where influence_data.source_id = influence_source.id
group by influence_source.src
having max(influence_data.date) < now()::date - 7
order by max_date;

これはDjangoのORMを使用して可能ですか?

私はもう試した:

>> Source.objects.raw("select influence_source.src, max(influence_data.date) as max_date from influence_data, influence_source where influence_data.source_id = influence_source.id group by influence_source.src having max(influence_data.date) < now()::date - 7 order by max_date")
<RawQuerySet: 'select influence_source.src, max(influence_data.date) as max_date from influence_data, influence_source where influence_data.source_id = influence_source.id group by influence_source.src having max(influence_data.date) < now()::date - 7 order by max_date'>
>> list(_)
InvalidQuery: Raw query must include the primary key

(主キーを追加するとDatabaseError: column "influence_source.id" must appear in the GROUP BY clause or be used in an aggregate function

集計ドキュメントを読みましたが、このクエリを実行する方法がわかりません。

>> Source.objects.all().aggregate(Max('data__date'))
{'data__date__max': datetime.date(2012, 11, 16)} # a single result was not what I wanted

最新のデータオブジェクトが3日以上経過しているすべてのソースオブジェクトを見つけるにはどうすればよいですか?データがたくさんあるので、オブジェクトを反復処理するのではなく、単一のDBクエリを実行したいと思います。

4

1 に答える 1

0
import datetime

three_days_ago = datetime.datetime.now() - datetime.timedelta(3)
Source.objects.annotate(max_date=Max('data__date')).exclude(max_date__gt=three_days_ago).order_by('max_date')
于 2012-12-03T15:09:25.333 に答える