2011-01-05 1 views
1

У меня есть список Person s каждый, у которого есть несколько полей, которые я обычно фильтрую, что происходит, используя общий вид object_list. У каждого человека может быть несколько привязанных к ним Comment с каждым днем ​​и текстовой строкой. То, что я в конечном итоге хочу сделать, это возможность фильтровать комментарии на основе дат.django join-like расширение 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) 

То, что я хочу сделать, это получить QuerySet как

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

отправить что QuerySet в object_list и быть в состоянии видеть только комментарии, упорядоченные по дате только с таким количеством объектов на странице.

Например, если «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 queryset's comment_set в более крупный набор запросов, который можно сортировать и упорядочивать на основе комментария и помещать в общий вид object_list. Это обычно довольно просто сделать в SQL с помощью JOIN, но я не хочу отказаться от ORM, который я использую везде.


ОК, мое решение было в основном просто Comments.objects.filter(); разделите шаблон на отдельный файл, который включен в соответствующий способ, примените дополнительный контекст boolean (если 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) кортежей и сортирует их в Python.

Однако, я не знаю, что ваша причина для не желающих использовать Comment.objects.filter() Вероятно, это будет довольно быстро, особенно если индексировано ваше поле даты.

+0

Это почти удваивает количество кода в представлении и шаблоне и пытаться сохранить СУХИЕ, и ожидая, что там будет простое решение, которое я просто пропускаю, позволяя мне реализовать соединение. Django позволяет мне заказывать врачей, основанных на датах комментариев (с повторениями), но не позволит мне увидеть комментарии, на которых была основана сортировка? Мне это кажется странным. Причина, по которой я не хочу отфильтровывать комментарий, заключается в том, что мой шаблон и представление представляют собой пару 100 строк и представляют собой интересные вещи, которые я не хочу реализовывать двумя разными способами. –

+0

Я считаю, что исходный запрос отключен, 'Person.objects.filter (comment__date__gt = date (2011,1,1)). Order_by ('comment__date')' Если мое понимание верное на SQL, это сгенерирует основные это собирается заказать людям по их первому комментарию. Что отличное от comment_date_filter, а не comment_date_filter.Почему фильтрует разные , чем не фильтрует? Что я имею в виду, почему бы не просто сделать это в представлении: 'if filter: objects = Comments.filter (...). Order_by (...) else: objects = Comments.order_by (...) ' – milkypostman

+0

Также посмотрите http://docs.djangoproject.com/en/1.2/ref/models/querysets/#values – milkypostman