Django如何按外键关联的最新剧集发布日期对电视剧对象排序
实现方案
方案1:直接获取去重的电视剧列表(推荐)
如果你需要的是无重复的电视剧条目,按最新剧集发布日期倒序,推荐直接对TvShows查询集做聚合注解,步骤如下:
- 先导入所需聚合函数
from django.db.models import Max import datetime
- 编写查询语句
def tv_show_by_set_just_released(request): # 提前计算90天前的日期阈值,和DateField类型匹配避免类型问题 cutoff_date = datetime.date.today() - datetime.timedelta(days=90) latest_tv_shows = TvShows.objects.filter( # 筛选近90天有更新剧集的电视剧 episode_show_relation__release_date__lte=datetime.date.today(), episode_show_relation__release_date__gt=cutoff_date ).annotate( # 给每个电视剧新增注解字段:该电视剧下所有剧集的最新发布日期 latest_ep_release = Max('episode_show_relation__release_date') ).order_by( # 按最新发布日期倒序,最新更新的排在最前 '-latest_ep_release' ) # 后续直接把latest_tv_shows传给模板渲染即可,每个元素都是TvShows对象
方案2:从现有剧集查询集获取关联电视剧
如果你需要保留原有的剧集查询逻辑,只想拿到每集对应的电视剧对象:
只需要在原查询中加上select_related('show')提前加载关联的电视剧数据,避免N+1查询问题:
def tv_show_by_set_just_released(request): latest_episodes = TvShowEpisodes.objects.filter( release_date__lte=datetime.date.today(), release_date__gt=datetime.date.today()-datetime.timedelta(days=90) ).select_related('show') # 新增这行提前加载关联的电视剧 .order_by('-release_date') # 遍历时直接取episode.show即可得到对应的电视剧对象 for episode in latest_episodes: tv_show = episode.show print(tv_show.title)
注意:这种方式得到的结果会有重复的电视剧(同一部剧近90天更新多集时会出现多条记录),如果需要去重的电视剧列表优先选方案1。
额外提醒
你的模型中两个类的管理器都用了RandomManager,如果这个管理器默认会返回随机排序的结果,你的order_by语句要放在查询的最后,才会覆盖随机排序的规则。
内容的提问来源于stack exchange,提问作者user16837137
相关产品推荐
相关产品推荐

