Как отобразить несколько моделей в 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, если вам нужно изменить ориентацию.

Вернуться на верх