首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

django orm 的小问题

  •  
  •   wplct · 10 天前 · 585 次点击

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

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

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

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

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

    同步问题,只能是你整体设计解决的,要具体情况具体分析。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3374 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 25ms · UTC 03:31 · PVG 11:31 · LAX 20:31 · JFK 23:31
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1