2011-01-05 2 views
1

나는 object_list 제네릭 뷰를 사용하여 보통 필자가 필터링하는 여러 필드가있는 각각 Person리스트를 가지고있다. 각 사람은 복수의 Comment을 첨부 할 수 있습니다. 각각은 datetime 및 텍스트 문자열을가집니다. 궁극적으로 원하는 것은 날짜를 기준으로 의견을 필터링하는 옵션이 있다는 것입니다. 내가 원하는 무엇django join queryset 확장하기

class Person(models.Model): 
    name = models.CharField("Name", max_length=30) 
    ## has ~30 other fields, usually filtered on as well 

class Comment(models.Model): 
    date = models.DateTimeField() 
    person = models.ForeignKey(Person) 
    comment = models.TextField("Comment Text", max_length=1023) 

는 object_list 만 페이지 만 많은 개체를 날짜순으로 의견을 표시 할 수 있도록하는 검색어 세트를 보내

Person.objects.filter(comment__date__gt=date(2011,1,1)).order_by('comment__date') 

같은 검색어 세트를 얻을 수있다.

예를 들어, "Person A"에 의견이 있다면 12/12/2010, 1/2/2011, 1/5/2011, "Person B"는 의견이없고 사람 C는 1/3/2010 년 내가 볼 것입니다 :

"Person A", 1/2 - comment 
"Person C", 1/3 - comment 
"Person A", 1/5 - comment 

나는 그 날은 뷰와 템플릿 모두에서 코드의 많은 부분을 대부분을 반복해야 할 것 같은 Comments.objects.filter()에 따라 필터링으로 전환해야하지 않으려는 강한 것입니다.

지금 바로 다음 명령을 실행 해보면 (PersonA, PersonC, PersonA)를 반환하는 쿼리 세트를 얻을 수 있지만, 템플릿에 렌더링하려고하면 각 사람의 comment_set에 모든 주석이 포함됩니다. t를 선택하십시오.

Person 쿼리 세트의 comment_set을 큰 쿼 리 세트로 확장하여 주석을 기준으로 정렬 및 정렬하고 object_list 제네릭 뷰에 넣을 수있는 기능이 이상적입니다. 이것은 일반적으로 JOIN을 사용하여 SQL에서 수행하는 것이 매우 간단하지만 다른 곳에서 사용하는 ORM을 포기하고 싶지 않습니다.


OK, 내 솔루션은 기본적으로 그냥 Comment.objects.filter(); 템플릿을 적절한 방법으로 포함 된 별도의 파일로 분할하고 추가 컨텍스트를 적용합니다. 부울 (comment_date_filter 인 경우보기에서 모든 사람 참조 앞에 해당 접두사 문자열을 적용합니다 (즉, ''또는 'person__') :

{% if comment_date_filter %} 
    {% for obj in object_list %} 
     {% with obj.person as p %} 
     {% include "object_list_row.html" %} 
     {% endwith %} 
    {% endfor %} 
{% else %} 
    {% for obj in object_list %} 
     {% with obj as p %} 
     {% include "object_list_row.html" %} 
     {% endwith %} 
    {% endfor %} 
{% endif %} 

답변

3

당신이 다른 옵션은 파이썬에서 그들을 모두 (Person, Date, Comment) 튜플로 밖으로 개체를 끌어와 정렬 할 수 있습니다.

그러나, 내가 모르는 어떤 Comment.objects.filter를 사용하고자하지 않는 이유() 이것은 특히 귀하의 날짜 필드가 색인되어있는 경우에 상당히 빠를 것입니다.

+0

뷰 및 템플릿의 코드를 작성하고 DRY를 유지하려고 노력하며 간단한 해결책이 있어야만 조인을 구현할 수 있다는 것을 간과 할 수 있습니다. Django를 사용하면 의사가 주석 날짜 (반복 가능)를 기반으로 의사를 주문할 수는 있지만 정렬을 기반으로 한 주석을 볼 수는 없습니까? 그건 나에게 이상한 것 같다. Comment에서 필터링하고 싶지 않은 이유는 내 템플릿과 뷰가 두 개의 100 라인이고 두 가지 분리 된 방식으로 구현하고 싶지 않은 멋진 일을하기 때문입니다. –

+0

원래 쿼리가 꺼져 있다고 믿습니다. 'Person.objects.filter (comment__date__gt = date (2011,1,1)). order_by ('comment__date ')' SQL에 대한 이해가 정확하면 기본 이것은 그들의 첫 번째 논평에 의해 사람들을 명령 할 것입니다. comment_date_filter와 다른 점은 comment_date_filter입니다.필터링이 필터링보다 다른 이유는 무엇입니까 ? 내 말은, 그냥보기에서 이것을하지 않는 것입니다 : 'if filtered : objects = Comments.filter (...). order_by (...) else : objects = Comments.order_by ...)' – milkypostman

+0

http://docs.djangoproject.com/ko/1.2/ref/models/querysets/#values도 확인하십시오. – milkypostman

관련 문제