我有一个模型,它以每列一个整数统计数据为基础存储统计数据。我有一个处理上述统计信息更新的 View ,如下所示:
class PlayerStats(models.Model):
#In game stats - these represent the actual keys sent by the game
NumberOfJumps = models.IntegerField(default=0)
NumberOfDoubleJumps = models.IntegerField(default=0)
NumberOfSilverPickups = models.IntegerField(default=0)
NumberOfGoldPickups = models.IntegerField(default=0)
NumberOfHealthPickups = models.IntegerField(default=0)
我基本上得到了一个统计数据字典,我需要将其添加到数据库中存储的当前统计数据中。
我真的不想从模型中提取所有数据然后再次更新它,因为如果可能的话,我想在数据库级别执行此操作。
一位同事建议我使用 django 的 F() 对象,以便将其推出 View 代码,主要是为了保持线程安全并避免任何 mysql 死锁(统计表可能会不断更新通过不同的线程)
字典包含的键反射(reflect)了数据库中使用的键,所以目前我是这样做的:
def update_stats(new_stats):
player_stats = PlayerStats(user=user, **new_stats)
old_stats = player_stats.values()[0]
updated_stats = {}
for stat in new_stats:
if old_stat[stat]:
updated_stats[stat] = old_stats[stat] + new_stats[stat]
PlayerStats.objects.filter(user=user).update(**updated_stats)
有人知道如何使用 F() 对象实现此目的吗?
最佳答案
要使用 models.F
进行更新,您需要构建如下内容
qs.update(field_1=models.F('field_1')+field_1_delta,
field_2=models.F('field_2')+field_2_delta,
...)
对于你的代码,它可能是
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)
关于python - 使用 django F() 对象更新多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15574187/