django расширение, похожее на соединение - PullRequest
1 голос
/ 06 января 2011

У меня есть список 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 %}

1 Ответ

3 голосов
/ 06 января 2011

Другой вариант, который у вас есть, - вытащить все объекты в виде (Person, Date, Comment) и отсортировать их в Python.

Однако я не знаю, по какой причине вы не хотите использовать Comment.objects.фильтр().Скорее всего, это будет довольно быстро, особенно если ваше поле даты проиндексировано.

...