python - 使用 django F() 对象更新多列

标签 python mysql django

我有一个模型,它以每列一个整数统计数据为基础存储统计数据。我有一个处理上述统计信息更新的 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/

相关文章:

python - 格式化字符串并用数组元素填充

python - 从代码中的方法打印当前调用堆栈

mysql - 修改 bash 脚本以获取文件中的每一行并执行命令

mysql - MySQL 是否将 Varchar 视为绝对值?

python - Virtualenv创建了一个文件夹,但结果不是我想要的

python - Django 开发服务器错误 : image not found

Python 和 Yum 发布 CentOS 5.4

MySQL - 计算自表中重置事件以来的累积

javascript - 如何使用 dajax/dajax-ice 填充 div?

python - 使用 2 个不同的应用程序构建一个 python 项目