如何"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