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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:35:36