django orm 的小问题

2018-09-14 15:32:30 +08:00
 wplct

写单元测试遇到的,搜索搜不到答案,因为关键词不对

一个 orm 对象 如 user 我在其他地方修改了数据库

现在该如何使 user 对象更新到数据库的最新情况

2081 次点击
所在节点    Python
7 条回复
Pythoner666666
2018-09-14 16:07:41 +08:00
比如你把 User 对象的 name 修改成了新的名字叫 yuan
User.update(name="yuan")
wplct
2018-09-14 16:10:55 +08:00
@Pythoner666666 #1 我已经在其他地方更新,数据已经是 name=yuan 了
可是我当前这个 user 对象的 name 还是没变
我想要这个 user 对象根据数据库把 name 变成 yuan
PureWhiteWu
2018-09-14 16:11:53 +08:00
@wplct 重新从数据库读一遍呗。。。
hsfzxjy
2018-09-14 16:14:52 +08:00
user.refresh_from_db()
zhangkunkyle
2018-09-14 18:03:44 +08:00
@wplct 这个问题在工作场景遇到过,异步多次请求,后请求完成修改的时候总会把之前修改的覆盖掉,经过研究发现,orm 中 obj.save()会覆盖字段内容,使用 queryset.update 则只更新要更新的字段内容,其他字段保留数据库中当前最新内容不会覆盖
zhangkunkyle
2018-09-14 18:07:59 +08:00
@wplct 所以,用 User.objects.filter(user_object.pk)拿到 user 对象的 queryset,然后 queryset .update 就好了,可以封装一下再加上一些字段处理方便使用,不再用。object.save()覆盖已修改内容的烦恼
xpresslink
2018-09-14 22:58:25 +08:00
楼主的问题没有问清楚。
你是要解决多线程数据一致性问题?还是要解决数据的同步推送问题?

一致性问题只要加锁就可以了。
locked_user = User.objects.select_for_update().get(pk=1)

同步问题,只能是你整体设计解决的,要具体情况具体分析。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/489356

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX