Фильтрация данных из Firestore в Django, передача в HTML-шаблон

У меня есть данные, хранящиеся в Firestore, и я хотел бы получить данные из коллекции, отфильтровать их и опубликовать в шаблоне HTML.

Я использую Django в качестве фреймворка.

VIEWS.py

from django.shortcuts import render
import pyrebase
from firebase_admin import firestore
import datetime

db = firestore.Client()

config = {
    "apiKey": "xxxxxx",
    "authDomain": "xxxxxx.firebaseapp.com",
    "databaseURL": "https://xxxxxx.firebaseio.com",
    "projectId": "xxxxxx",
    "storageBucket": "xxxxxx.appspot.com",
    "messagingSenderId": "xxxxxx",
    "appId": "xxxxxx",
    "measurementId": "xxxxxx",
    "serviceAccount": "xxxxxx.json",
    }

# DATABASE
firebase = pyrebase.initialize_app(config)
authe = firebase.auth()
database = firebase.database()
print(database)

# TIME & DATE
today_date = datetime.datetime.now()
tomorrow_date = today_date + datetime.timedelta(days=1)
games_today = today_date.strftime("%Y-%m-%d")
games_tomorrow = tomorrow_date.strftime("%Y-%m-%d")
print(games_today)
print(games_tomorrow)


# NBA EVENT DATA
def xxxxx_basketball_nba_events(request):
    nba_events = db.collection('xxxxx_au').document('basketball_nba').collection('event_info').stream()
    event_info = [doc.to_dict() for doc in nba_events]

    nba_games = sorted(event_info, key=lambda k: k['event_start'], reverse=True)
    print(nba_games)

    return render(request, 'html/nba.html', {'data': nba_games})

HTML шаблон

{% block content %}
    
<table class="table table-striped" style="padding: 15px; width: 1000px">
<thead>
    <tr>
      <th scope="col">Event ID</th>
      <th scope="col">Competition</th>
      <th scope="col">Event Name</th>
      <th scope="col">Event Start</th>
      <th scope="col">Event Status</th>
    </tr>
  </thead>
{% for xxx_nba in data %}
  <tbody>
    <tr>
      <th>{{xxx_nba.event_id}}</th>
      <td>{{xxx_nba.competition}}</td>
      <td>{{xxx_nba.event_name}}</td>
      <td>{{xxx_nba.event_start}}</td>
      <td>{{xxx_nba.event_status}}</td>
    </tr>
  </tbody>
{% endfor %}
</table>

{% endblock %} 

HTML Output

1018936256  NBA Los Angeles Lakers - Portland Trail Blazers 2022-12-01T03:30:00Z    NOT_STARTED
1018936251  NBA Sacramento Kings - Indiana Pacers   2022-12-01T03:00:00Z    NOT_STARTED
1018936209  NBA Phoenix Suns - Chicago Bulls    2022-12-01T02:00:00Z    NOT_STARTED
1018936229  NBA Utah Jazz - Los Angeles Clippers    2022-12-01T02:00:00Z    NOT_STARTED
1018936241  NBA Denver Nuggets - Houston Rockets    2022-12-01T02:00:00Z    NOT_STARTED
1018936233  NBA Oklahoma City Thunder - San Antonio Spurs   2022-12-01T01:00:00Z    NOT_STARTED
1018936246  NBA Minnesota Timberwolves - Memphis Grizzlies  2022-12-01T01:00:00Z    NOT_STARTED
1018936258  NBA New Orleans Pelicans - Toronto Raptors  2022-12-01T01:00:00Z    NOT_STARTED
1018936245  NBA New York Knicks - Milwaukee Bucks   2022-12-01T00:41:56Z    STARTED
1018936268  NBA Boston Celtics - Miami Heat 2022-12-01T00:40:58Z    STARTED
1018936243  NBA Brooklyn Nets - Washington Wizards  2022-12-01T00:40:43Z    STARTED
1018936226  NBA Cleveland Cavaliers - Philadelphia 76ers    2022-12-01T00:10:25Z    STARTED
1018936242  NBA Orlando Magic - Atlanta Hawks   2022-12-01T00:10:19Z    STARTED
1018936272  NBA Portland Trail Blazers - Los Angeles Clippers   2022-11-30T03:00:00Z    NOT_STARTED
1018936236  NBA Dallas Mavericks - Golden State Warriors    2022-11-30T00:30:00Z    NOT_STARTED
1018936230  NBA Detroit Pistons - New York Knicks   2022-11-30T00:00:00Z    NOT_STARTED
1018936255  NBA Los Angeles Lakers - Indiana Pacers 2022-11-29T03:30:00Z    NOT_STARTED
1018936259  NBA Sacramento Kings - Phoenix Suns 2022-11-29T03:00:00Z    NOT_STARTED
1018936225  NBA Denver Nuggets - Houston Rockets    2022-11-29T02:00:00Z    NOT_STARTED
1018936240  NBA Utah Jazz - Chicago Bulls   2022-11-29T02:00:00Z    NOT_STARTED
1018936249  NBA New Orleans Pelicans - Oklahoma City Thunder    2022-11-29T01:00:00Z    NOT_STARTED
1018936264  NBA Toronto Raptors - Cleveland Cavaliers   2022-11-29T00:30:00Z    NOT_STARTED
1018936266  NBA Boston Celtics - Charlotte Hornets  2022-11-29T00:30:00Z    NOT_STARTED
1018936275  NBA Brooklyn Nets - Orlando Magic   2022-11-29T00:30:00Z    NOT_STARTED
1018936215  NBA Philadelphia 76ers - Atlanta Hawks  2022-11-29T00:00:00Z    NOT_STARTED
1018936237  NBA Washington Wizards - Minnesota Timberwolves 2022-11-29T00:00:00Z    NOT_STARTED
1018936297  NBA Milwaukee Bucks - Dallas Mavericks  2022-11-28T01:00:00Z    NOT_STARTED

Мне нужно отфильтровать по событию_start, которое имеет формат

2022-12-01T02:00:00Z

Я пытаюсь переформатировать эту дату так, чтобы я мог использовать 2022-12-01 раздел данных даты для фильтрации игр за день.

Я хотел бы отправлять данные в HTML только для тех игр, которые есть в базе данных и время начала которых (event_start) совпадает с датой дня (games_today).

Будем признательны за любую помощь в фильтрации этих данных по дате и публикации в HTML-документе.

вместо создания потока/ снимка подколлекции event_info, почему бы вам не создать снимок/поток запроса подколлекции event_info, который будет возвращать только данные, удовлетворяющие только вашему фильтру запроса::

Я делаю вывод из этой части вашего кода:

nba_events = db.collection('xxxx_au').document('basketball_nba').collection('event_info').stream()
event_info = [doc.to_dict() for doc in nba_events]

Это возвращает все данные только для подколлекции event_info

Вы можете создать поток запросов/ моментальный снимок следующим образом

# Create an Event for notifying main thread.
callback_done = threading.Event()

# Create a callback on_snapshot function to capture changes
def on_snapshot(col_snapshot, changes, read_time):
    print(u'Callback received query snapshot.')
    print(u'Current cities in California:')
    for doc in col_snapshot:
        print(f'{doc.id}')
    callback_done.set()

col_query = db.collection(u'cities').where(u'state', u'==', u'CA')

# Watch the collection query
query_watch = col_query.on_snapshot(on_snapshot)

Подробнее об этом читайте здесь: https://firebase.google.com/docs/firestore/query-data/listen#python_3

Я думаю, что для фильтрации запросов нужно использовать следующий формат даты :

today_date = datetime.datetime.now()
tomorrow_date = today_date + datetime.timedelta(days=1)
games_today = today_date.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
games_tomorrow = tomorrow_date.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
print(games_today)   #will give you same date format that is stored in firestore
print(games_tomorrow)

затем отфильтровать на основе даты, как вы отфильтровали. Затем присвойте его коллекции и представьте в html.

Вернуться на верх