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']}
谢谢这正是我需要的