当前位置:  开发笔记 > 编程语言 > 正文

更新Django模型对象的多个字段的有效方法

如何解决《更新Django模型对象的多个字段的有效方法》经验,为你挑选了3个好方法。

我正在尝试更新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()

但这不起作用.任何想法如何更新用户而不为每条记录做这件事?



1> 9000..:

您可以更新数据库中的行而无需获取和反序列化它; update()可以做到.例如:

User.objects.filter(id=data['id']).update(email=data['email'], phone=data['phone'])

这将发出一个SQL update语句,并且比您帖子中的代码快得多.它永远不会获取数据或浪费时间创建User对象.

但是,您不能将大量更新数据发送到SQL数据库,并要求它一次性将其映射到不同的行.如果你需要一个非常快速的大规模更新,你最好的选择可能是将数据插入一个单独的表中,然后在该表上更新它select.据我所知,Django ORM不支持这一点.



2> Moinuddin Qu..:

如果使用对象的.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,因此它将始终返回单个记录.



3> Alex Hall..:
setattr(old_user, fetched_data_key, fetched_data['fetched_data_key'])

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有