Фильтрация данных из 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.