gzz*_*zur 5 python mysql django
我有一个模型,它以每列一个整数统计数据来存储统计数据。我有一个处理所述统计数据更新的视图,如下所示:
\n\nclass PlayerStats(models.Model):\n #In game stats - these represent the actual keys sent by the game\n NumberOfJumps = models.IntegerField(default=0)\n NumberOfDoubleJumps = models.IntegerField(default=0)\n NumberOfSilverPickups = models.IntegerField(default=0)\n NumberOfGoldPickups = models.IntegerField(default=0)\n NumberOfHealthPickups = models.IntegerField(default=0)\nRun Code Online (Sandbox Code Playgroud)\n\n我基本上得到了一个统计字典,我需要将其添加到数据库中存储的当前统计数据中。
\n\n我真的不想\xc2\xb4t 想要从模型中提取所有数据,然后再次更新它,因为如果可能的话,我想在数据库级别上执行此操作。
\n\n一位同事建议我使用 django\xc2\xb4s F() 对象,以便将其从视图代码中推出,主要是为了保持线程安全并避免任何 mysql 死锁(统计表可能会通过以下方式不断更新)不同的线程)
\n\n该字典包含镜像数据库中使用的键,因此目前我\xc2\xb4m 这样做:\n
\n\ndef update_stats(new_stats):\n player_stats = PlayerStats(user=user, **new_stats)\n old_stats = player_stats.values()[0]\n updated_stats = {}\n for stat in new_stats:\n if old_stat[stat]:\n updated_stats[stat] = old_stats[stat] + new_stats[stat]\n PlayerStats.objects.filter(user=user).update(**updated_stats)\nRun Code Online (Sandbox Code Playgroud)\n\n有人知道如何使用 F() 对象来实现这一点吗?
\n要更新 using models.F,您需要构造类似的东西
qs.update(field_1=models.F('field_1')+field_1_delta,
field_2=models.F('field_2')+field_2_delta,
...)
Run Code Online (Sandbox Code Playgroud)
对于你的代码来说,它可能是
new_stats = {
'NumberOfHealthPickups': 99
# ...
}
updated_stats = {}
for stat in new_stats:
updated_stats[stat] = models.F(stat) + new_stats[stat]
PlayerStats.objects.filter(user=user).update(**updated_stats)
Run Code Online (Sandbox Code Playgroud)