对数据库的更新从套接字上的同一会话中删除旧数据

Updates to the database deletes older data from the same session on the socket

我正在制作一款您可以在线玩的井字游戏。我想保存每个用户的赢/输计数,我正在使用 Django 3.2,频道 3 和 channels_presence 与 Python 3.9

我已经成功构建了socket和客户端,现在你可以尽情地玩游戏了。

问题是我尝试保存的分数存储在数据库中,但在另一场比赛后分数returns归零。

所以如果两个用户在一个房间里玩并且用户 1 赢了 2 场比赛,分数就会更新,然后如果另一个用户赢了一场比赛他们的分数将是 1 而用户 1 的分数将被重置为零

我的用户模型

class CustomUser(AbstractUser):
    won_games = models.IntegerField(default=0)
    lost_games = models.IntegerField(default=0)
    draw_games = models.IntegerField(default=0)

    def win(self):
        self.won_games += 1
        self.save() 

    def lose(self):
        self.lost_games += 1
        self.save() 

    def draw(self):
        self.draw_games += 1
        self.save() 

我已经将它放入我的 consumers.py

的接收函数中
class GameConsumer(WebsocketConsumer):
    #some code
    def receive(self, text_data):

        if text_data['type'] == 'completed':
            self_channel = Presence.objects.get(channel_name=self.channel_name)
            competitor = self_channel.room.presence_set.filter(
                                    ~Q(channel_name=self_channel)
                                   ).first().user
            user = self.scope['user']
            if competitor:
                competitor.win()
            if user.is_authenticated:
                user.lose()
    return

我依靠其他用户的消息来确认中奖,因此没有人可以向套接字发送假中奖

我已经尝试从数据库中删除所有用户,迁移我的数据库,改变 属性 won_games 的方式,如您所见,但问题是它 returns输完恢复默认

如果你能帮助我,这里是完整的源代码 https://github.com/ahmedyasserays/XO-online

所以我已经解决了这个问题,问题出在 user = self.scope['user'] 部分。 当你现在启动与消费者的连接时,一个新的消费者实例从你的 class 的内存中创建,具有像这样的一些属性 self.scope 用从另一个实例赢取的新数据更新数据库不会不会影响所有实例,相反,其他实例仍然会有尚未更新其数据的对象,在我们的例子中,它是 self.scope['user'],它仍然具有 won_games 的旧值,当我们尝试保存它,所以修复只是在应用 user.lose() 方法

之前添加 user = CustomUser.objects.get(id=user.id)