我正在尝试更新Django数据库中的用户.
提取的数据如下:
fetched_data = { 'id': 1, 'first_name': 'John', 'last_name': 'Doe', 'phone': '+32 12', 'mobile_phone': '+32 13', 'email': 'myemail@hotmail.com', 'username': 'myusername' }
我得到这个id的用户如下:
old_user = User.objects.get(pk=fetched_data['id'])
如果我按如下方式更新用户:
old_user.username = fetched_data['username'] old_user.first_name = fetched_data['first_name'] ...... old_user.save()
它工作正常,但我不想为每条记录都这样做,因此我尝试了类似的东西:
for fetched_data_key in fetched_data: old_user.fetched_data_key = fetched_data['fetched_data_key'] //old_user[fetched_data_key] = fetched_data['fetched_data_key'] --- I tried this way to old_user.save()
但这不起作用.任何想法如何更新用户而不为每条记录做这件事?
您可以更新数据库中的行而无需获取和反序列化它; update()
可以做到.例如:
User.objects.filter(id=data['id']).update(email=data['email'], phone=data['phone'])
这将发出一个SQL update
语句,并且比您帖子中的代码快得多.它永远不会获取数据或浪费时间创建User
对象.
但是,您不能将大量更新数据发送到SQL数据库,并要求它一次性将其映射到不同的行.如果你需要一个非常快速的大规模更新,你最好的选择可能是将数据插入一个单独的表中,然后在该表上更新它select
.据我所知,Django ORM不支持这一点.
如果使用对象的.update()
方法,则更简单QuerySet
:
my_id = fetched_data.pop('id') # remove 'id' from `fetch_data` # as it is not supposed to be updated User.objects.filter(pk=my_id).update(**fetched_data) # unpack the content of `dict` ^
这将解压的内容fetched_data
字典和将更新记录User
对象的列是存在关键的fetched_data
字典.由于您正在调用过滤器pk
,因此它将始终返回单个记录.
setattr(old_user, fetched_data_key, fetched_data['fetched_data_key'])