2012-11-29 1 views
0

가입 :장고에 최대를 찾아내는 나는 두 가지 모델이

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; 

이 가능 장고의 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 

나는 aggregation docs을 읽은

(기본 키를 추가하면 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 쿼리를 수행하려고합니다.

답변

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')