You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django如何按外键关联的最新剧集发布日期对电视剧对象排序

实现方案

方案1:直接获取去重的电视剧列表(推荐)

如果你需要的是无重复的电视剧条目,按最新剧集发布日期倒序,推荐直接对TvShows查询集做聚合注解,步骤如下:

  1. 先导入所需聚合函数
from django.db.models import Max
import datetime
  1. 编写查询语句
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:48:04