我有一个叫做电影的课程:
class Movie(models.Model):
title = models.CharField(max_length=511)
tmdb_id = models.IntegerField(null=True, blank=True, unique=True)
release = models.DateField(null=True, blank=True)
poster = models.TextField(max_length=500, null=True)
backdrop = models.TextField(max_length=500, null=True, blank=True)
popularity = models.TextField(null=True, blank=True)
和一个名为Trailer的课程:
class Trailer(models.Model):
movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
link = models.CharField(max_length=100)
date = models.DateTimeField(auto_now_add=True)
如何显示按预告片日期订购的所有电影?
我已经尝试过:Movie.objects.order_by('trailer__date')
但是这会导致多个重复项,并且也没有按照正确的顺序显示它们,如何避免重复项,并且每个按电影订阅日期排序的电影都有一个条目?
编辑:我刚注意到它没有显示所有条目,只是其中一些条目
答案 0 :(得分:3)
更新:OP希望按最新预告片日期排序,而不是按最早的预告片日期排序。
如果您愿意,可以在此处使用注释:
from django.db.models import Min
qs = Movie.objects.values('title').annotate(latest_trailer=Max('trailer__date')).order_by('-latest_trailer')
# Add other columns you want into the `values` if you need them
或者您可以使用原始查询并将其与词典联系起来。
from collections import OrderedDict
qs = Movie.objects.order_by('-trailer__date')
movies = OrderedDict()
for x in qs:
if x.id not in movies:
movies[x.id] = x
movies = movies.values()
目前还不清楚当他们有多个预告片时你想要电影的顺序,所以我猜这是基于最早的预告片。
答案 1 :(得分:0)
@ 2ps的答案很接近,但没有像我希望的那样工作,无论是升序还是降序,但我终于找到了基于他的答案:
from django.db.models import Max
qs = Movie.objects.annotate(Max("trailer__date")).order_by('-trailer__date__max')