2011-02-08 5 views
6
class Log: 
project = ForeignKey(Project) 
msg = CharField(...) 
date = DateField(...) 

각 로그 항목에 고유 한 프로젝트 외래 키가 있어야하는 최신 4 개의 로그 항목을 선택하고 싶습니다.Django : 다른 외래 키

Log.objects.all().distinct('project')[:4] 
Log.objects.values('project').distinct()[:4] 
Log.objects.values_list('project').distinct('project')[:4] 

하지만이 아무것도 돌려주지 않는 또는 중 하나

내가 좋아하는 물건을 시도 .. I했습니다 구글 검색에 대한 솔루션을 시도하지만 그들 중 누구도 작동하지 않습니다와 장고 내용은 해당 조회에 매우 좋지 않다 동일한 프로젝트의 로그 항목 ..

도움이 될 것입니다!

답변

9

쿼리는 Django의 ORM 또는 기본 SQL 에서처럼 작동하지 않습니다. 고유 한 ID를 얻으려는 경우에만 ID를 조회 할 수 있습니다. 따라서 실제 로그 항목을 얻으려면 두 가지 쿼리를 수행해야합니다. 예 :

id_list = Log.objects.order_by('-date').values_list('project_id').distinct()[:4] 
entries = Log.objects.filter(id__in=id_list) 
+0

는 unfortuatly, 답변을 ID_LIST = Log.objects.order_by ('- 날짜') 감사합니다. values_list ('PROJECT_ID')를 별개의() 이 .. 작동하지 않습니다. 별개의 것들은 분류하지 않습니다. 체인에서 order_by()를 제거하면 작동하지만 날짜순으로 정렬되지는 않습니다 ... – mrmclovin

+0

여전히 작동하지 않습니다.이 문제에 도움이되지 않습니까? – mrmclovin

+0

pk를 시도하거나 python의 reduce() 함수를 사용하십시오. –

3

실제로 SQL에서 project_ids를 가져올 수 있습니다. 최신 로그 항목에 네 개의 프로젝트에 대한 고유 프로젝트 ID를 원하는 가정하면, SQL은 다음과 같이 보일 것이다 :

SELECT project_id, max(log.date) as max_date 
FROM logs 
GROUP BY project_id 
ORDER BY max_date DESC LIMIT 4; 

이제, 당신이 실제로 로그 정보를 모두합니다. PostgreSQL의 8.4 이상에서 당신은 기능을 윈도 사용할 수 있지만 그것은 다른 버전/데이터베이스에서 작동하지 않습니다, 그래서 나는 그것을 더 복잡한 방법으로 할 수 있습니다 : 당신이에 액세스 할 수 경우, 지금

SELECT logs.* 
FROM logs JOIN (
    SELECT project_id, max(log.date) as max_date 
    FROM logs 
    GROUP BY project_id 
    ORDER BY max_date DESC LIMIT 4) as latest 
ON logs.project_id = latest.project_id 
    AND logs.date = latest.max_date; 

을 윈도우 기능이 실행 확실히 빠른 비트 깔끔한 (I 어쨌든 생각), 그리고 : 어쩌면 이해하기 쉽게 아니다,

SELECT * FROM (
    SELECT logs.field1, logs.field2, logs.field3, logs.date 
     rank() over (partition by project_id 
        order by "date" DESC) as dateorder 
    FROM logs) as logsort 
WHERE dateorder = 1 
ORDER BY logs.date DESC LIMIT 1; 

OK,하지만 내 말을, 더 빨리 큰 데이터베이스에 세계를 실행 .

개체 구문으로 변환하는 방법이나 그렇지 않은 경우에도 완전히 모르겠습니다. 또한 다른 프로젝트 데이터를 가져 오려면 프로젝트 테이블에 조인해야합니다. .

+0

해답을 가져 주셔서 감사합니다! 그것을 시도 할 것이다! – mrmclovin