2009-12-07 2 views
2

여기 조인과 페이지 매김에 문제가 있습니다. 나는 3 개 모델이 있습니다효율적인 장황한 페이지 매기기

  • 패드
  • 태그
  • TagRelation을

나는 테 ManyToMany 필드의 속성을 통해 와 패드 및 태그 (betweent ManyToMany 관계를 관리하기 위해 태그 관계를 사용). 나는 패드 및 태그 테이블에 가입 할 때 내가 그것을 페이지 당 계산 분명히 잘못된 항목의 결과에서 매기기() 객체를 생성 할 때 지금은 ... 지금 나에게

pad.name tag.name  etc 
--------------------------- 
pad1  tag1   ... 
pad1  tag2   ... 
pad2  tag3   ... 

를 같은 것을 제공합니다. 나는 ...

[{name:'pad1', tags:['tag1', 'tag2']}, {name:'pad2' ....] 

을 모든 결과를 축복하는 반복이 같은 사전을 생성해야 ... 올바른 페이지를 얻을이에 매기기를 사용합니다.

이 문제에 대한 최선의 방법은 무엇입니까? 나는 그것의 태그를 얻으려면 현재 페이지에서 각 패드 개체에 대한 DB 쿼리를 할 수 있지만 조만간 서버를 죽일 것이라고 생각합니다 (performant 있어야합니다).

결과의 내용도 꽤 길 수 있고 전체 세트를 반복하면 많은 시스템 메모리가 필요합니다 (또는 나에게 계몽 할 수 있습니다 :)).

답변

3

정확하게 이해했다면 Pad.objects.all()에서 페이지 매김을 수행 한 다음 TagRelation 객체에서 select_related을 두 가지 방법으로 사용하여 하나의 (추가) 쿼리에서 적절한 태그를 가져 와서 보기/템플릿의 데이터. 다음과 같이하십시오 :

(mypageobject에 페이지 개체가 있다고 가정). 그런 다음 주어진 tagrel에 대한 패드와 태그를 얻을 수 있습니다 (regroup 템플릿 태그를 사용하는 것이 가장 쉬운 방법 일 수 있습니다).하지만 DB는 하나의 (거대한) 쿼리 만 수행하므로 페이지 매김 횟수는 여전히 정확합니다.

many-to-many 필드 (this ticket 참조)에서 select_related를 직접 사용할 수 없으므로 2 개의 쿼리를 수행해야했지만, 중간 m2m에서 FK를 따라갈 수 있습니다 표.

+0

이 태그는 항목별로 필터링 할 수 없습니다. 거대한 조인과 수동 (코드 내) 후 처리를 둘러싼 어떠한 방법도없는 것처럼 보입니다. 당신이 태그에 의해 필터링하려면 –

+0

아,하지만 당신이 안전하게 할 수 있습니다 (당신은 단지 하나의 특정 태그를 이야기하고 가정) 다시 TagRelation 페이지를 매기는, 그리고 해당 : TagRelation.objects.filter (태그 = someTagObject)로 당신의 페이지 매김 객체는 각 패드에 대해 정확히 하나의 Tagrel을 제공해야합니다 (동일한 태그를 여러 번 패드에 태그 할 수 없다고 가정 할 때). –