Как отобразить несколько моделей в Django ListView?
Я пытаюсь отобразить несколько моделей через ListView. После некоторых исследований... я определил, что могу сделать что-то вроде...
class MultiModelListView(LoginRequiredMixin,ListView):
model = MultiModel
context_object_name = 'thing_list'
template_name = 'view_my_list.html'
paginate_by = 15
def get_context_data(self, **kwargs):
context = super(MultiModelListView, self).get_context_data(**kwargs)
list1 = Model1.objects.filter(created_by=self.request.user)
list2 = Model2.objects.filter(created_by=self.request.user)
list3 = Model3.objects.filter(created_by=self.request.user)
context['list1'] = list1
context['list2'] = list2
context['list3'] = list3
return context
А затем в моем шаблоне.... перебираем каждый список....
{% for thing in list1 %}
Show thing
{% endfor %}
{% for thing in list2 %}
Show thing
{% endfor %}
{% for thing in list3 %}
Show thing
{% endfor %}
Это бы сработало... но я действительно хочу объединить события и отсортировать их по дате создания, которая есть у всех моделей.... Я действительно хочу сделать порядок по для всех событий... не по списку как таковому... Есть ли прямой способ сделать это.... Или мне нужно создать "главную" модель, в которой определены все эти модели, чтобы достичь моей цели?
Заранее спасибо за любые мысли.
Вы можете объединить QuerySet
объекты, если измените их на списки. Затем отсортируйте их с помощью lambda
. Предположим, что вы хотите сортировать по атрибуту created_at
:
def get_context_data(self, **kwargs):
context = super(MultiModelListView, self).get_context_data(**kwargs)
list1 = list(Model1.objects.filter(created_by=self.request.user))
list2 = list(Model2.objects.filter(created_by=self.request.user))
list3 = list(Model3.objects.filter(created_by=self.request.user))
list_all = list1 + list2 + list3
context["list_all"] = sorted(list_all, key=lambda x: x.created_at)
return context
Вы всегда можете использовать reverse=True
в функции sorted
, если вам нужно изменить ориентацию.