Django - 按外键排序

时间:2016-10-01 23:47:18

标签: python django

我有一个叫做电影的课程:

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')但是这会导致多个重复项,并且也没有按照正确的顺序显示它们,如何避免重复项,并且每个按电影订阅日期排序的电影都有一个条目?

编辑:我刚注意到它没有显示所有条目,只是其中一些条目

2 个答案:

答案 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')