나는 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 %}
뷰 및 템플릿의 코드를 작성하고 DRY를 유지하려고 노력하며 간단한 해결책이 있어야만 조인을 구현할 수 있다는 것을 간과 할 수 있습니다. Django를 사용하면 의사가 주석 날짜 (반복 가능)를 기반으로 의사를 주문할 수는 있지만 정렬을 기반으로 한 주석을 볼 수는 없습니까? 그건 나에게 이상한 것 같다. Comment에서 필터링하고 싶지 않은 이유는 내 템플릿과 뷰가 두 개의 100 라인이고 두 가지 분리 된 방식으로 구현하고 싶지 않은 멋진 일을하기 때문입니다. –
원래 쿼리가 꺼져 있다고 믿습니다. '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
http://docs.djangoproject.com/ko/1.2/ref/models/querysets/#values도 확인하십시오. – milkypostman