在列表视图中显示多个查询集

时间:2018-02-19 18:45:14

标签: django django-models django-templates django-views

我试图将多个模型作为时间轴显示多个查询集,并按时间排序,而不是在我的当前代码看起来像另一个后显示一个查询集:

<div class="user-info col-md-8">
{% for obj in user.marks_set.all %}
                     <p>{{ obj.module }}</p> 
                      <p>{{ obj.grade }}</p>
                      <p>{{ obj.date }}</p>
{% endfor %}
{% for obj in events %}
                      {{ obj.content }}
{% endfor %}
</div>

所有型号都有日期字段,我试图按日期显示所有内容并按顺序排序,而不是显示所有标记,然后是所有事件

3 个答案:

答案 0 :(得分:1)

您可以将所有查询集压缩在一起。因此,如果覆盖get_context_data然后说你有变量事件和包含事件querset和标记queryset的标记,你可以将它们存储到一个上下文变量中。然后在模板中,您可以将所有内容放在表格中,并为事件和标记设置单独的列。这会按照日期顺序排列所有内容,但它们只是在不同的列中。

Views.py

class MyClass(ListView):
    get_context_data(self,**kwargs):
        context = super().get_context_data(**kwargs)
        events = Events.objects.all().order_by('-date')
        marks = Marks.objects.all().order_by('-date')
        context['group'] = zip(events,marks)
        return context

模板

<table class="table">
    <thead class="thead">
        <tr>
            <th>Events</th>
            <th>Marks</th>
        </tr>
    </thead>
    <tbody>
        {% for events,marks in group %}
            <td>{{ events }}</td>
            <td>{{ marks }}</td>
        {% endfor %}
    </tbody>
</table>

答案 1 :(得分:1)

尽管与核心问题无关,但由于标题而显示了此答案,所以我将其发布给新手:

  

要从单个ListView返回多个查询集,如果可以将所有查询集组合到一个变量中,则它在Django中变得可以接受。简单的方法是使用字典。

例如:我需要从同一模型中获取两个查询,一个是所有卖家,另一个是前5名卖家。 因此,在 views.py:

class ViewName(ListView):
    model = ModelName
    template_name = "seller_info.html"
    context_object_name = 'sellers'

    def get_queryset(self):
        queryset = {'all_sellers': ModelName.objects.all(), 
                    'top_seller': ModelName.objects.all().filter(is_highest=True)[:5]}
        return queryset

seller_info.html 中,您可以通过以下方式访问每个查询集:

  

用于显示所有卖家:

{% if sellers %}
    {% for seller in sellers.all_sellers %}
      <p> {{ seller.name }} </p>
    {% endfor %}
{% endif %}
  

用于显示top_seller:

{% if sellers.top_seller %}
    {% for seller in sellers.top_seller %}
      <p> {{ seller.name }} </p>
    {% endfor %}
{% endif %}

请注意,如果只有一位畅销商品,那么也请使用上述html格式,但请修改查询集,例如:'top_seller': ModelName.objects.all().filter(is_highest=True)[:1]

答案 2 :(得分:0)

我这样做的方式是使用itertools链和attrgetter

from itertools import chain
from operator import attrgetter

class MyListView(ListView):
    template_name = 'list.html'
    def get_queryset(self):
        qs1 = events.objects.all() #your first qs
        qs2 = marks.objects.all()  #your second qs
        #you can add as many qs as you want
        queryset = sorted(chain(qs1,qs2),key=attrgetter('timestamp'),)
        return queryset

从这篇文章得到了答案Combine 2 Django Querysets from Different Models