Django: запрос сортировки по общему значению столбца

#django #sorting

#django #сортировка

Вопрос:

Эй, допустим, у меня есть эта модель:

 class Log:
 msg = CharField(...)
 project = ForeignKey(..)
 date = DateField(..)
  

Теперь, допустим, я хочу выбрать 4 самых последних журнала:

  logs = Log.objects.order_by('project').order_by('-date')[:4]
  

Кроме того, я хочу извлечь журналы, которые используют один и тот же проект, поэтому в моем шаблоне я хотел бы сделать что-то вроде:

  {% for proj in projects %}
   [Do something with the proj model instance]
   {% for log in proj.logs(?) %}
     [Do something with logs]
   {% endfor %}
 {% endfor %}
  

Как?

Комментарии:

1. Как две части вашего вопроса связаны друг с другом?

2. Вы хотите выбрать некоторые проекты, а затем выполнить итерацию по журналам в этих проектах? Пока есть внешний ключ, это все, что вам нужно сделать … для входа в proj.log_set

Ответ №1:

В вашем шаблоне вы могли бы перегруппировать по проектам.

Из документов что-то (непроверенное) вроде

 {% regroup logs|dictsort:"project.id" by project as project_list %}

{% for project in project_list %}
    {{ project.grouper }}
        {% for item in project.list %}
            [Do something with logs]
        {% endfor %}
{% endfor %}
  

Ответ №2:

 {% for proj in projects %}
  {{ proj.name }}
  {% for log in proj.log_set.all %}
    {{ log.msg }}
  {% endfor %}
{% endfor %}
  

Если вы используете related_name для своего внешнего ключа (скажем, «logs»), вы могли бы, вы могли бы использовать
proj.logs вместо proj.log_set. Проверьте документы.

Если вам нужны последние журналы для проекта на регулярной основе, я бы подумал о написании метода для вашей модели проекта:

 def recent_logs(self):
    return self.log_set.all()[:4]
  

Затем вы могли бы настроить цикл в своем шаблоне так, чтобы:

 {% for log in proj.recent_logs %}
    {{ log.msg }}
{% endfor %}