我正在尝试更新Django数据库中的用户.
提取的数据如下:
fetched_data = {
'id': 1,
'first_name': 'John',
'last_name': 'Doe',
'phone': '+32 12',
'mobile_phone': '+32 13',
'email': 'myemail@hotmail.com',
'username': 'myusername'
}
Run Code Online (Sandbox Code Playgroud)
我得到这个id的用户如下:
old_user = User.objects.get(pk=fetched_data['id'])
Run Code Online (Sandbox Code Playgroud)
如果我按如下方式更新用户:
old_user.username = fetched_data['username']
old_user.first_name = fetched_data['first_name']
......
old_user.save()
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我不想为每条记录都这样做,因此我尝试了类似的东西:
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()
Run Code Online (Sandbox Code Playgroud)
但这不起作用.任何想法如何更新用户而不为每条记录做这件事?
900*_*000 16
您可以更新数据库中的行而无需获取和反序列化它; update()可以做到.例如:
User.objects.filter(id=data['id']).update(email=data['email'], phone=data['phone'])
Run Code Online (Sandbox Code Playgroud)
这将发出一个SQL update语句,并且比您帖子中的代码快得多.它永远不会获取数据或浪费时间创建User对象.
但是,您不能将大量更新数据发送到SQL数据库,并要求它一次性将其映射到不同的行.如果你需要一个非常快速的大规模更新,你最好的选择可能是将数据插入一个单独的表中,然后在该表上更新它select.据我所知,Django ORM不支持这一点.
Moi*_*dri 13
如果使用对象的.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` ^
Run Code Online (Sandbox Code Playgroud)
这将解压的内容fetched_data字典和将更新记录User对象的列是存在关键的fetched_data字典.由于您正在调用过滤器pk,因此它将始终返回单个记录.
如果您使用,.update则存在问题,因为它不会引发post_save或pre_save信号,因此如果您想对任何数据更改使用任何信号, User.objects.filter(pk=fetched_data['id']).update(**kwargs)则将不起作用。
因此,您可以使用setattr()来更新字段,然后.save保存将更新行的行也会引发信号。
old_user = User.objects.get(pk=fetched_data['id'])
for key, value in fetched_data.iteritems():
setattr(old_user, key, value)
old_user.save()
Run Code Online (Sandbox Code Playgroud)
setattr(old_user, fetched_data_key, fetched_data['fetched_data_key'])
Run Code Online (Sandbox Code Playgroud)