写单元测试遇到的,搜索搜不到答案,因为关键词不对
一个 orm 对象 如 user 我在其他地方修改了数据库
现在该如何使 user 对象更新到数据库的最新情况
1
Pythoner666666 2018-09-14 16:07:41 +08:00
比如你把 User 对象的 name 修改成了新的名字叫 yuan
User.update(name="yuan") |
2
wplct OP @Pythoner666666 #1 我已经在其他地方更新,数据已经是 name=yuan 了
可是我当前这个 user 对象的 name 还是没变 我想要这个 user 对象根据数据库把 name 变成 yuan |
3
PureWhiteWu 2018-09-14 16:11:53 +08:00
@wplct 重新从数据库读一遍呗。。。
|
4
hsfzxjy 2018-09-14 16:14:52 +08:00 via Android 1
user.refresh_from_db()
|
5
zhangkunkyle 2018-09-14 18:03:44 +08:00
@wplct 这个问题在工作场景遇到过,异步多次请求,后请求完成修改的时候总会把之前修改的覆盖掉,经过研究发现,orm 中 obj.save()会覆盖字段内容,使用 queryset.update 则只更新要更新的字段内容,其他字段保留数据库中当前最新内容不会覆盖
|
6
zhangkunkyle 2018-09-14 18:07:59 +08:00
@wplct 所以,用 User.objects.filter(user_object.pk)拿到 user 对象的 queryset,然后 queryset .update 就好了,可以封装一下再加上一些字段处理方便使用,不再用。object.save()覆盖已修改内容的烦恼
|
7
xpresslink 2018-09-14 22:58:25 +08:00
楼主的问题没有问清楚。
你是要解决多线程数据一致性问题?还是要解决数据的同步推送问题? 一致性问题只要加锁就可以了。 locked_user = User.objects.select_for_update().get(pk=1) 同步问题,只能是你整体设计解决的,要具体情况具体分析。 |