在Django 项目中我们想要实现一个功能,当数据存在时就更新数据,当数据不存在时,就进行创建,update_or_create 方法可以满足我们的要求,但是要理解它,不能盲目的应用到项目中

coin_user, b = CoinUser.objects.update_or_create(coin_id=16, coin_name="pig2", account_id=307,)
print(coin_user, type(coin_user), b, sep="--")
再次查询数据库:

数据新增了一条,并没有对原数据进行更新,显然不是我们想要的结果。
继续进行实验:
#update_or_create 方法中defaults 中的数据为要更新的结果,defaults 之外的是搜索条件
coin_user, b = CoinUser.objects.update_or_create(coin_id=16, coin_name="pig2", defaults={"account_id": 307})
print(coin_user, type(coin_user), b, sep="--")
输出结果
xt_account.models.MultipleObjectsReturned: get() returned more than one CoinUser -- it returned 3!
#通过输出结果可以得出只能对唯一的数据进行处理
coin_user, b = CoinUser.objects.update_or_create(coin_id=16, coin_name="pig2", account_id=307,
defaults={"account_id": 309})
print(coin_user, type(coin_user), b, sep="--")
输出结果
pig2--<class 'xt_account.models.CoinUser'>--False

猜想是正确的
我们再次执行以下代码:
coin_user, b = CoinUser.objects.update_or_create(coin_id=16, coin_name="pig2", account_id=307,
defaults={"account_id": 309})
print(coin_user, type(coin_user), b, sep="--")
输出结果
pig2--<class 'xt_account.models.CoinUser'>--True
由于我们之前已经对oin_id=16, coin_name=“pig2”, account_id=307 数据进行操作,数据库中不存在account_id=307的数据,故重新创加一条记录 b = True ,由于设置了默认值defaults 所以创建的记录如下图:

我们现在把defaults 清空,看一下是不是我们上面解释的内容:
coin_user, b = CoinUser.objects.update_or_create(coin_id=16, coin_name="pig2", account_id=307,
defaults={})
print(coin_user, type(coin_user), b, sep="--")
输出结果:
pig2--<class 'xt_account.models.CoinUser'>--True

猜想正确