При обращении к бд в вебсокете django возвращаются неправильный данные
Пишу вебсокет для карточной браузерной игры на django и channels. Когда раунд заканчивается происходит подсчет результатов, сам подсчет работает правильно и даже сохраняет подсчеты в бд. Но в конце следующего раунда, при обращении к бд, она возвращает данные, которые были до предыдущего раунда. То есть если в начале первого раунда у всех 0 очков, в конце у кого-то стало 3 очка, в конце следующего раунда при расчете результата из бд возвращаются 0 очков. Хотя при начале того же раунда всем игрокам были отправлены данные полученные из бд что у кого то 3 очка. Не могу понять почему это происходит, никакого кэширования я не подключал.
Тут можно посмотреть код всего проекта.
Ниже код метода вебсокета для расчета результатов. Проблема в данных возвращаемых в players:
async def calculate_results(self, event):
game = await database_sync_to_async(Game.objects.get)(
id=self.game_id
)
players = await database_sync_to_async(
lambda: list(Player.objects.filter(game=game))
)()
self.round_num = await get_round_num(game)
for player in players:
round = await database_sync_to_async(Round.objects.get)(
game=game,
round_num=self.round_num
)
association = await database_sync_to_async(Association.objects.get)(
round=round,
player=player
)
choices = await database_sync_to_async(
lambda: list(Choice.objects.filter(
card=association.card, round=round))
)()
data = {}
leader = await database_sync_to_async(lambda: round.leader)()
points = 0
if player == leader:
who_chose = []
choices_count = len(choices)
players_count = await database_sync_to_async(game.players.count)()
if 0 < choices_count < players_count - 1:
points += 3 + choices_count
player.points += points
who_chose = await database_sync_to_async(
lambda: [ch.player.id for ch in choices]
)()
else:
leader_association_card = await database_sync_to_async(
lambda: Association.objects.get(
round=round, player=leader).card
)()
pl_choice_card = await database_sync_to_async(
lambda: Choice.objects.get(round=round, player=player).card
)()
guess_right = False
if leader_association_card.id == pl_choice_card.id:
points += 3
guess_right = True
points += len(choices)
player.points += points
who_chose = await database_sync_to_async(lambda: [ch.player.id for ch in choices])()
data.update({'guess_right': guess_right})
await database_sync_to_async(player.save)()
data.update({"who_chose_your_cards": who_chose,
"points_for_round": points, "all_points": player.points})
if player.points >= game.points_to_win:
game.status = GameStatus.FINISHED
if game.winner:
game.winner = await database_sync_to_async(
lambda: player if player.points > game.winner.points else game.winner
)()
else:
game.winner = player
await database_sync_to_async(game.save)()
await self.channel_layer.group_send(
f"player_{player.id}",
{
'type': 'send_message',
'data': data
}
)
winner = await database_sync_to_async(lambda: game.winner)()
if winner:
await self.channel_layer.group_send(
"public_room",
{
"type": "send_message",
"data": {"winner": winner.id}
}
)