Django分组和筛选、排序

Django分组和筛选、排序,django,django-views,Django,Django Views,我正在为我们的电影网站创建一个小项目 我有模型 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() 每部电影都有几个不同

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

我有模型

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()
每部电影都有几个不同的放映


我怎样才能让电影按名称分组并按《第一个星展》排序,以及该电影的所有投影按《星展》排序

列表如下所示:

result = {}
for movie in Movies.objects.all():
    movie_projections = movie.projections_set.all().values_list('startshow', flat=True).order_by('startshow')
    movie_projections = [str(x) for x in movie_projections]

    result[movie.name] = movie_projections

print(result)
  • 部队:世界巡演

    • 2020-11-10 17:00
    • 2020-11-11 17:00
    • 2020-11-12 17:00
  • 冻结

    • 2020-11-10 19:00
    • 2020-11-11 19:00
    • 2020-11-12 19:00
  • 坦尼特

    • 2020-11-10 21:00
    • 2020-11-11 21:00
    • 2020-11-12 21:00

请帮助

您基本上只需通过电影列表,然后反复浏览相关的
投影

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})
从django.db.models导入最小值,预取
def myview(请求):
movies=Movie.objects.annotate(
第一次开始=最小值(“投影开始显示”)
).prefetch_相关(
预取(
“投影集”,
Projections.objects.order_by('startshow'),
到\u attr='ordered\u projections'
)
).order_by('first_start')
返回渲染(请求'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>
    {%用于电影中的电影%}
  • {{movie.name}
    • {%用于电影中的投影。有序投影%}
    • {{projection.startshow}}
    • {%endfor%}
    {%endfor%}

注意:通常Django型号的名称为单数,因此
电影
而不是
电影


试试这样的方法:

result = {}
for movie in Movies.objects.all():
    movie_projections = movie.projections_set.all().values_list('startshow', flat=True).order_by('startshow')
    movie_projections = [str(x) for x in movie_projections]

    result[movie.name] = movie_projections

print(result)
这是此代码的返回格式:

{'Titanic': ['2020-11-22 10:42:09+00:00', '2020-11-23 20:42:09+00:00'], 'Robocop': ['2020-11-22 20:42:23+00:00']}

谢谢这正是我需要的