如何通过过滤子模型获取父模型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
相关产品推荐
相关产品推荐

