2013-03-14 1 views
3

내가 sqlite3를하고 MySQL과 테스트있어 다음과 같은 모델이 있습니다 장고 : 최대 외래 키 값에 고유 한 값을 선택

# (various model fields extraneous to discussion removed...) 

class Run(models.Model): 
    runNumber = models.IntegerField() 

class Snapshot(models.Model): 
    t = models.DateTimeField() 

class SnapshotRun(models.Model): 
    snapshot = models.ForeignKey(Snapshot) 
    run = models.ForeignKey(Run) 
    # other fields which make it possible to have multiple distinct Run objects per Snapshot 

나는 나에게 runNumbers & 스냅 샷 ID의 집합을 줄 것이다 쿼리를 원하는을 어떤 Snapshot.id는 지정된 값 아래에 있습니다.

print SnapshotRun.objects.filter(snapshot__id__lte=ss_id)\ 
         .order_by("run__runNumber", "-snapshot__id")\ 
         .distinct("run__runNumber", "snapshot__id")\ 
         .values("run__runNumber", "snapshot__id") 

을하지만이 두 데이터베이스 백엔드에 대한

NotImplementedError: DISTINCT ON fields is not supported by this database backend 

와 불면 : 순진하게도 나는이 일을 기대. Postgres는 불행히도 옵션이 아닙니다.

원시 SQL로 폴백 할 시간이 필요합니까?

업데이트 :

장고의 ORM이 하나 (감사 @jknupp) 내가 얻을 관리 않았다 밖으로 나에게 도움이되지 않습니다 때문에 다음과 같은 원시 SQL이 작동하기 : 여기

cursor.execute(""" 
      SELECT r.runNumber, ssr1.snapshot_id 
      FROM livedata_run AS r 
      JOIN livedata_snapshotrun AS ssr1 
      ON ssr1.id = 
      (
       SELECT id 
       FROM livedata_snapshotrun AS ssr2 
       WHERE ssr2.run_id = r.id 
        AND ssr2.snapshot_id <= %s 
       ORDER BY snapshot_id DESC 
       LIMIT 1 
      ); 
""", max_ss_id) 

livedata .이 테이블에 장고 애플 리케이션 살고있다

+0

그래서 각 행에 반환 된 (여러 개의)'snapshot' ID가 들어있는'runNumbers' 목록을 반환하기를 원하십니까? –

+0

@ TimmyO'Mahony not quite; 모든 실행에 대해 최신 (단, ss_id를 초과하지는 않음) 인 단일 snapshot_id를 가져 오려고합니다. – JohnJ

답변

2

노트 in the Django documentation 꽤 분명하다

참고 :

order_by() 호출에 사용 된 모든 필드는 SQL SELECT 열에 포함됩니다. distinct()와 함께 사용하면 예기치 않은 결과가 발생할 수 있습니다. 관련 모델의 필드별로 정렬하는 경우 해당 필드가 선택된 열에 추가되고 그렇지 않으면 중복 행이 구별되는 것처럼 보일 수 있습니다. 추가 열은 반환 된 결과에 표시되지 않으므로 (순서 지정을 지원할 수만 있습니다) 때로는 뚜렷하지 않은 결과가 반환되는 것처럼 보입니다.

마찬가지로 values ​​() 쿼리를 사용하여 선택한 열을 제한하면 모든 order_by() (또는 기본 모델 순서)에 사용 된 열이 계속 영향을 미치고 결과의 고유성에 영향을 미칠 수 있습니다.

여기에서 도덕적 인 점은 distinct()를 사용하는 경우 관련 모델의 순서에주의해야한다는 것입니다. 마찬가지로, distinct()와 values ​​()를 함께 사용하면 values ​​() 호출에없는 필드로 정렬 할 때주의해야합니다. 그 아래 또

:

(별개로) 필드 이름을 지정하려면이 기능은 PostgreSQL의에서만 사용할 수 있습니다.