Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >django queryset.update上的原子事务(**kwargs)

django queryset.update上的原子事务(**kwargs)
EN

Stack Overflow用户
提问于 2016-08-30 23:01:14
回答 1查看 3.5K关注 0票数 3

Djangoqueryset.update方法似乎在transaction.atomic上下文管理器下执行。在update期间,我什么时候需要在代码中显式地执行它?或者,这样做有什么好处,或者不执行它会有什么问题?

代码

代码语言:javascript
运行
AI代码解释
复制
try:
    queryset = Model.objects.filter(a=1)
    if queryset.count():
        with transaction.atomic():
            queryset.update(a=2) # queryset will [] after this.
            for item in queryset: 
                item.emit_event('Updated')
except:
    logger.info('Exception')

我的问题是,我真的需要transaction.atomic():在这里吗?

其次,在.update之后,我的queryset变得空,因为它是一个过滤的queryset。如何在我的情况下保留这些值,因为我想在各个对象上发出一个事件。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-30 23:25:48

First

As 文档状态

原子性是数据库事务的定义属性。原子允许我们创建一个代码块,在其中保证数据库的原子性。如果代码块已成功完成,则将更改提交到数据库。如果有异常,则回滚更改。

在您的示例中,如果atomic正在执行某些操作,则需要emit_event,并且只有在所有emit_event函数调用和queryset.update都成功的情况下,才需要执行此更新。但是,如果emit_event的状态不影响更新的业务逻辑,那么这里的atomic将是多余的,因为正如您自己所说的,update有内部atomic

第二

Queryset很懒。这意味着查询集的评估将在迭代时完成。所以你需要做这样的事。回答最新评论

代码语言:javascript
运行
AI代码解释
复制
try:
    queryset = Model.objects.filter(a=1)
    item_ids = list(queryset.values_list('id', flat=True)) # store ids for later
    if item_ids: # optimzing here instead of queryset.count() so there won't be hit to DB
        with transaction.atomic():
            queryset.update(a=2) # queryset will [] after this.
            for item in Model.objects.filter(id__in=item_ids):  # <- new queryset which gets only updated objects
                item.emit_event('Updated')
except:
    logger.info('Exception')

请看,我们在迭代时创建新的queryset以获得更新的项。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39242799

复制
相关文章
Django 进阶学习 - 动态actions
Django后台默认只有一个动作Delete selected xxxxs, 那么如果自定义动作该怎么办, 也很容易, 直接写个类似于这种的函数
用户1416054
2018/08/02
4270
Django 进阶学习 - 动态actions
Redis事务的实现机制以及保证事务的原子性
Redis事务的实现机制是基于命令的队列化执行,通过将多个命令封装在MULTI和EXEC之间来实现连续的命令执行。
一凡sir
2023/10/02
7410
Redis事务的实现机制以及保证事务的原子性
ZooKeeper如何保证事务原子性?
先解答疑惑,题主对ZAB理解是正确的。为了便于描述,本文将事务理解为具有ACID的一组操作,一个ZooKeeper请求(例如:create)称之为提案。
并发笔记
2022/11/21
1K0
ZooKeeper如何保证事务原子性?
不支持原子性的 Redis 事务也叫事务吗?
为了确保连续多个操作的原子性,我们常用的数据库都会有事务的支持,Redis 也不例外。但它又和关系型数据库不太一样。
海星
2020/09/07
2.5K0
*args 和 **kwargs的用法
一 简介 *args 和 **kwargs 主要用于函数定义。 当我们需要定义的函数的传入参数个数不确定时,可以使用*args 和 **kwargs 代替不确定的参数个数。其实并不是必须写成*args 和**kwargs。 只有变量前面的 *(星号)才是必须的. 我们可以写成*var和**vars. 而写成*args 和**kwargs只是一个通俗的命名约定。 二 使用 2.1 *args 当函数的参数个数不确定且不需要指定参数名称时,*args的格式是常规的参数 val1[,val2,val3....]
用户1278550
2018/08/09
5040
spring事务(上)
这篇其实也要归纳到《常识》系列中,但这重点又是spring的介绍,故归档在spring系列中。
码农戏码
2021/03/23
7930
Django后台管理之Admin actions自定义
通常情况下,admin的工作模式是“选中目标,然后修改目标”,但在同时修改大量目标的时候,这种模式就变得重复、繁琐。
菲宇
2019/08/14
2.2K0
django 1.8 官方文档翻译: 2-3-2 关联对象参考
“关联管理器”是在一对多或者多对多的关联上下文中使用的管理器。它存在于下面两种情况:
ApacheCN_飞龙
2022/11/27
5130
Django数据库--事务及事务回滚
数据库的读写操作中,事务在保证数据的安全性和一致性方面起着关键的作用,而回滚正是这里面的核心操作。Django的ORM在事务方面也提供了不少的API。有事务出错的整体回滚操作,也有基于保存点的部分回滚。本文将讨论Django中的这两种机制的运行原理。
py3study
2020/01/19
4K0
django 1.8 官方文档翻译:7-2 管理操作
简而言之,Django管理后台的基本流程是,“选择一个对象并改变它”。在大多数情况下,这是非常适合的。然而当你一次性要对多个对象做相同的改变,这个流程是非常的单调乏味的。
ApacheCN_飞龙
2022/11/27
7830
django 1.8 官方文档翻译:7-2 管理操作
面试必会之事务如何保证原子性-undo日志
之前聊过,事务需要保证原子性,要么全部完成,要么什么也不做,但是经常会出现事务在执行到一半时会出现情况,例如:
热心的大肚皮
2023/02/28
8220
面试必会之事务如何保证原子性-undo日志
django-transaction 事务回滚
事务回滚 #0 GitHub https://github.com/Coxhuang/django-transaction.git #1 环境 Python3.6 Django==2.0.6 #2 需求 用户的数据包括基本资料表A,特殊资料表B;在新增用户时,需要对表A和表B进行操作,如果A添加数据成功,但是B添加数据失败,此时,我们希望A的数据也被删除 在支付的时候,如果支付中发生异常,那么异常之前的操作,我们也希望回到原始状态 #3 事务回滚 事务回滚就是在操作数据库时,如果发生异常,能让数据回到原来的
Autooooooo
2020/11/09
1.3K0
django-transaction 事务回滚
什么是*args和**kwargs?
可以看到,这两个是python中的可变参数。*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个dict。并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前,像foo(a=1, b='2', c=3, a', 1, None, )这样调用的话,会提示语法错误“SyntaxError: positional argument follows keyword argument”。
狼啸风云
2020/05/14
1.3K0
python: *args & **kwargs
Python是支持 可变参数 的,实现手段之一就是使用 *args 和 **kwargs 语法。
JNingWei
2018/09/28
1K0
*args和**kwargs
*args 和**kwargs常用于方法定义,*args 和**kwargs允许你传递可变数量的参数到函数里,可变数量在这里的意思是,你事先不知道有多少个参数可以传递给你的函数,所以在这种情况下,你使用这两个关键字。*args 用于传递一个non-keyword的参数list给函数,看示例
Helloted
2022/06/07
2950
解释*args和**kwargs的含义
当我们不知道向函数传递多少参数时,比如我们向传递一个列表或元组,我们就使用*args
狼啸风云
2020/01/13
5260
web | Django,高大上的存在
欢迎关注【佛系学python】~ 最近听到一首好听的歌,分享给大家~ 概念 Django是一种 免费开源的高级python Web应用框架 用于快速开发Web网站 由经验丰富的开发人员构建 它解决了Web开发的大部分麻烦 因此您可以专注于编写应用程序 而无需重新发明轮子 架构设计 Django基于MVC模式 其中M代表模型(model) V代表视图(view) C代表控制器(control) 但是在Django中 控制器接受用户输入的部分 由框架自行处理 所以Django里更关注的架构是 MTV
佛系编程人
2019/08/14
7640
web | Django,高大上的存在
python中*args和**kwargs的区别
*args是函数使用者可以发送任意数量非键值对的参数传给这个函数,*args在接收参数后,将返回值以元组tuple的形式返回。
用户7886150
2020/12/19
4900
Python中 *args 和 **kwargs 的含义?
小猿会从最基础的面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的 。
程序员小猿
2021/01/19
7910
python *args,**kwargs参数
实际上,关键的是*和** 我们以三个例子来解释: 普通的使用参数: def test1(arg): print(arg) test1("a") 输出: a *是将剩下的参数用元祖表示 def test1(arg1,arg2,*args): print(arg1) print(arg2) print(args) test1(1,2,3,"a","b") 输出: 1 2 (3, 'a', 'b') **是将参数转换成字典进行表示 def test2(**kwargs):
西西嘛呦
2020/08/26
5240

相似问题

Django原子事务实际上不是原子事务吗?

119

Django: queryset.update上的信号

10

Django方法相关事务的原子事务

12

django事务原子信任吗?

12

Django原子事务与TransactionManagementError

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档