У меня есть список Person
с каждым, в котором есть несколько полей, которые я обычно фильтрую, используя общий вид object_list. К каждому человеку может быть прикреплено несколько Comment
, каждый с указанием даты и времени и текстовой строкой. В конечном итоге я хочу фильтровать комментарии по датам.
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)
Что я хочу сделать, так это получить набор запросов типа
Person.objects.filter(comment__date__gt=date(2011,1,1)).order_by('comment__date')
отправьте этот набор запросов объектному списку и сможете видеть только упорядоченные по дате комментарии с таким количеством объектов на странице.
Например, если у «Лица А» есть комментарии 12/12/2010, 1/2/2011, 05.01.2011, у «Лица Б» нет комментариев, а у человека С есть комментарии от 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 будет содержать все свои комментарии, даже если они этого не делают. в диапазоне дат.
В идеале была бы какая-то функциональность, в которой я мог бы расширить comment_set
набора запросов *1020* в больший набор запросов, который можно отсортировать и упорядочить на основе комментария и поместить в общее представление object_list. Обычно это довольно просто сделать в SQL с JOIN, но я не хочу отказываться от ORM, который я использую везде.
ОК, мое решение было в основном просто Comments.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 %}