在Django中从Firestore过滤日期匹配的赛事数据并渲染到HTML
Django + Firestore 筛选当日NBA赛事数据并渲染的正确方案
问题根源
你之前的代码在循环中提前使用return,导致找到第一条匹配的赛事数据后就直接返回,无法收集所有当日赛事。正确的做法是先收集所有符合条件的数据,再统一传递给模板。
解决方案
1. 基础实现:本地筛选所有当日赛事
先从Firestore拉取全部数据,在本地提取日期并筛选,适合数据量较小的场景:
from datetime import date from django.shortcuts import render import firebase_admin from firebase_admin import firestore # 初始化Firestore客户端(确保已在项目中完成初始化配置) if not firebase_admin._apps: firebase_admin.initialize_app() db = firestore.client() def todays_nba_games(request): # 获取当日日期,格式与event_start的日期部分一致(YYYY-MM-DD) games_today = date.today().strftime("%Y-%m-%d") todays_games = [] # 遍历Firestore中的所有赛事数据 games_ref = db.collection('nba_games').stream() for game in games_ref: game_data = game.to_dict() # 提取event_start的日期部分(分割T字符取前半段) event_date = game_data['event_start'].split('T')[0] # 匹配则加入列表 if event_date == games_today: todays_games.append(game_data) # 将所有匹配数据传递给模板 return render(request, 'nba_games.html', {'games': todays_games})
2. 优化实现:Firestore端直接过滤(推荐)
避免拉取全量数据,利用Firestore的查询能力在服务器端完成筛选,提升性能:
from datetime import date, datetime import pytz from django.shortcuts import render import firebase_admin from firebase_admin import firestore db = firestore.client() def todays_nba_games(request): games_today = date.today() # 构造当日UTC时间的起止范围(适配event_start的Z时区格式) start_of_day = datetime.combine(games_today, datetime.min.time()).replace(tzinfo=pytz.UTC) end_of_day = datetime.combine(games_today, datetime.max.time()).replace(tzinfo=pytz.UTC) # Firestore查询:筛选event_start在当日UTC范围内的赛事 games_ref = db.collection('nba_games') \ .where('event_start', '>=', start_of_day.isoformat()) \ .where('event_start', '<=', end_of_day.isoformat()) # 转换为字典列表 todays_games = [game.to_dict() for game in games_ref.stream()] return render(request, 'nba_games.html', {'games': todays_games})
3. HTML模板渲染示例
在nba_games.html中渲染筛选后的赛事数据:
<h2>今日NBA赛事</h2> {% if games %} <div class="game-list"> {% for game in games %} <div class="game-item"> <p><strong>{{ game.home_team }} VS {{ game.away_team }}</strong></p> <p>开赛时间:{{ game.event_start }}</p> <!-- 可添加更多赛事字段,如场馆、直播链接等 --> </div> {% endfor %} </div> {% else %} <p>今日暂无NBA赛事</p> {% endif %}
内容的提问来源于stack exchange,提问作者DrewS
相关产品推荐
相关产品推荐

