V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
wplct
V2EX  ›  Python

django orm 的小问题

  •  
  •   wplct · 2018-09-14 15:32:30 +08:00 · 2273 次点击
    这是一个创建于 2290 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    同步问题,只能是你整体设计解决的,要具体情况具体分析。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2243 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:01 · PVG 10:01 · LAX 18:01 · JFK 21:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.