#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 %}