如何"create or update"使用F对象?
How to "create or update" using F object?
如果 LeaderboardEntry 不存在,我需要创建它。如果存在,应使用新值(当前 + 新)进行更新。我想通过一个查询来实现这一点。我该怎么做?
当前代码如下所示:(2 个查询)
reward_amount = 50
LeaderboardEntry.objects.get_or_create(player=player)
LeaderboardEntry.objects.filter(player=player).update(golds=F('golds') + reward_amount)
PS:“金币”的默认值为 0。
我认为你的问题是 get_or_create()
方法,所以它 return 返回一个有两个值的元组,(object, created)
所以你必须在你的代码中接收它们,如下所示:
reward_amount = 50
entry, __ = LeaderboardEntry.objects.get_or_create(player=player)
entry.golds += reward_amount
entry.save()
它会比您的实际代码工作得更好,只是会避免进行两次查询。
当然 save()
方法会再次访问您的数据库。
您可以使用 defaults
减少一个查询的命中率:
reward_amount = 50
leader_board, created = LeaderboardEntry.objects.get_or_create(
player=player,
defaults={
"golds": reward_amount,
}
)
if not created:
leader_board.golds += reward_amount
leader_board.save(update_fields=["golds"])
你可以用update_or_create
解决这个问题:
LeaderboardEntry.objects.update_or_create(
player=player,
defaults={
'golds': F('golds') + reward_amount
}
)
编辑:
抱歉,update_or_create
中的 F
个表达式是 not yet supported。
如果 LeaderboardEntry 不存在,我需要创建它。如果存在,应使用新值(当前 + 新)进行更新。我想通过一个查询来实现这一点。我该怎么做?
当前代码如下所示:(2 个查询)
reward_amount = 50
LeaderboardEntry.objects.get_or_create(player=player)
LeaderboardEntry.objects.filter(player=player).update(golds=F('golds') + reward_amount)
PS:“金币”的默认值为 0。
我认为你的问题是 get_or_create()
方法,所以它 return 返回一个有两个值的元组,(object, created)
所以你必须在你的代码中接收它们,如下所示:
reward_amount = 50
entry, __ = LeaderboardEntry.objects.get_or_create(player=player)
entry.golds += reward_amount
entry.save()
它会比您的实际代码工作得更好,只是会避免进行两次查询。
当然 save()
方法会再次访问您的数据库。
您可以使用 defaults
减少一个查询的命中率:
reward_amount = 50
leader_board, created = LeaderboardEntry.objects.get_or_create(
player=player,
defaults={
"golds": reward_amount,
}
)
if not created:
leader_board.golds += reward_amount
leader_board.save(update_fields=["golds"])
你可以用update_or_create
解决这个问题:
LeaderboardEntry.objects.update_or_create(
player=player,
defaults={
'golds': F('golds') + reward_amount
}
)
编辑:
抱歉,update_or_create
中的 F
个表达式是 not yet supported。