如何在Django列表视图中显示多个模型?

bksxznpy  于 2023-01-31  发布在  Go
关注(0)|答案(1)|浏览(196)

我正在尝试通过列表视图显示几个模型。经过一些研究...我已经确定我可以做一些类似...

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

这是可行的......除了我真的想混合事件并按所有模型都具有的创建日期对它们排序......我真的想对所有事件进行排序......而不是按列表本身......是否有一种直接的方法可以做到这一点......或者我是否需要创建一个定义了所有这些模型的“主”模型才能实现我的目标?

vuktfyat

vuktfyat1#

如果将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

如果需要更改方向,您可以始终在sorted函数中使用reverse=True

相关问题