Skip to main content
 首页 » 编程设计

python之Django之通过外键排序

2024年08月22日28tuyile006

我有一个叫做电影的类(class):

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') 但这会导致多次重复并且也不会以正确的顺序显示它们,我怎样才能避免重复并拥有一个按预告片对象的日期排序的每部电影条目?

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

请您参考如下方法:

更新:OP 希望按最新的预告片日期而不是最早的预告片日期排序。

如果你愿意,你可以在这里使用注释:

from django.db.models import Max 
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() 

当电影有多个预告片时,不清楚您希望电影按什么顺序排列,所以我猜它是基于最早的预告片。