首页 > 解决方案 > Django 分组和过滤、排序

问题描述

我正在为我们的电影网站创建一个小项目

我有模型

class Movies(models.Model):
    name = models.CharField(max_length=100)
    ...
class Projections(models.Model):
    movie = models.ForeignKey(Movies, on_delete=models.DELETE)
    startshow = models.DateTimeField()

每部电影都有几个具有不同 startshow 的投影。


如何获取按名称分组并按第一个 startshow 排序的电影,以及按 startshow 排序的该电影的所有投影

该列表如下所示:

请帮忙

标签: djangodjango-views

解决方案


您基本上应该只传递 的列表Movies,然后遍历相关的Projections

from django.db.models import Min, Prefetch

def myview(request):
    movies = Movie.objects.annotate(
        first_start=Min('projections__startshow')
    ).prefetch_related(
        Prefetch(
            'projections_set',
            Projections.objects.order_by('startshow'),
            to_attr='ordered_projections'
        )
    ).order_by('first_start')
    return render(request, 'some_template.html', {'movies': movies})

然后在模板中渲染它:

<ul>
  {% for movie in movies %}
    <li>{{ movie.name }}</li>
    <ul>
      {% for projection in movie.ordered_projections %}
        <li>{{ projection.startshow }}</li>
      {% endfor %}
    </ul>
  {% endfor %}
</ul>

注意:通常 Django 模型被赋予一个单数名称,所以Movie而不是Movies.


推荐阅读