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

如何通过过滤子模型获取父模型TvProgram对象?

解决方案

1. 筛选出拥有7天内播出计划的节目

如果只需要获取存在至少一条7天内播出计划的TvProgram对象,直接通过关联模型的条件过滤即可:

from datetime import datetime, timedelta

seven_days_ago = datetime.now() - timedelta(days=7)

# 筛选出关联schedule在7天内的TvProgram
programs = TvProgram.objects.filter(
    tvprogramschedule__schedule__gte=seven_days_ago
).distinct()

使用distinct()是为了避免同一个节目因多条符合条件的schedule被重复返回。

2. 同时获取节目及其仅7天内的播出计划

如果不仅要筛选节目,还希望每个节目关联的TvProgramSchedule仅包含7天内的记录,需要用Prefetch对象精准预取关联数据:

from django.db.models import Prefetch
from datetime import datetime, timedelta

seven_days_ago = datetime.now() - timedelta(days=7)

# 定义仅包含7天内schedule的查询集
recent_schedules = TvProgramSchedule.objects.filter(
    schedule__gte=seven_days_ago
)

# 筛选节目并预取符合条件的schedule
programs = TvProgram.objects.filter(
    tvprogramschedule__schedule__gte=seven_days_ago
).distinct().prefetch_related(
    Prefetch('tvprogramschedule_set', queryset=recent_schedules, to_attr='recent_schedules')
)

之后可通过program.recent_schedules访问该节目仅7天内的播出计划,默认的program.tvprogramschedule_set仍会返回所有关联记录(若要替换默认关联集,可去掉to_attr参数,但更推荐用自定义属性区分)。

注意事项

若你的Django项目启用了时区(USE_TZ = True),建议用timezone.now()替代datetime.now(),避免时区不一致导致筛选错误:

from django.utils import timezone
seven_days_ago = timezone.now() - timedelta(days=7)

内容的提问来源于stack exchange,提问作者mirodil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:04:58