django 批量创建bulk_create和批量更新bulk_update

这篇具有很好参考价值的文章主要介绍了django 批量创建bulk_create和批量更新bulk_update。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、为什么要用bulk_create和bulk_update

以创建1万个对象为例,相比save() 循环和save() 事务,bulk_效率是save()循环保存的百倍,是事务处理的近10倍:

# 创建model(MyModel),此处省略
# 用for循环挨个创建,共花费36秒
for i in range(10000):
	name=f"{i} "
	MyModel.objects.create(name=name)
	
# 用django事务只提交一次,共花费2.60秒
@transaction.commit_manually
for i in range(10000):
	name=f"{i} "
	MyModel.objects.create(name=name)
	transaction.commit()

#  用bulk_create创建,共花费0.41秒

insert_list =[]
for i in range(10000):
	name=f"{i} "
	insert_list.append(MyModel(name=name))
MyModel.objects.bulk_create(insert_list)

# bulk_update 效率对比与上面类似,此处省略

二、bulk_create批量创建

用法:

queryset_list = []   # 创建列表,用与承载批量更新的对象数据
for goods_data in goods_list:  # 用for循环遍历需要创建的数据列表,注:这里默认为列表内元素goods_data 是字典格式
    queryset_list.append(MyModel(**goods_data))  # 把创建元素添加到列表
MyModel.objects.bulk_create(queryset_list)  # 批量创建

三、bulk_update批量更新

用法:文章来源地址https://www.toymoban.com/news/detail-505152.html

queryset = MyModel.objects.filter(is_delete=False)   # 创建对象,model 中有字段 'goods_id' 、'buy_num '、'kill_num'
sec_kill_num = []    # 创建列表,用与承载批量更新的对象数据
# 使用for循环,这里循环的是查询条件,如果不需要循环查询条件那么直接循环上面的queryset就可以省略下面的.first()步骤
for _id in goods_id_list:   # goods_id_list 是无数查询 条件的列表,这里使用的 商品的id
    _obj = queryset .filter(goods_id=_id).first()   # 很重要!!!,必须先获得一条唯一的数据
    if _obj:   # 很重要!!! 判断这条数据是否存在
        _obj.buy_num += 1  # 修改字段数据
        _obj.kill_num -= 1  # 修改字段数据
        sec_kill_num.append(_obj)   # 把修改数据后的对象添加到列表
sec_kill_info.bulk_update(sec_kill_num, ['buy_num', 'kill_num'])   # 批量更新

到了这里,关于django 批量创建bulk_create和批量更新bulk_update的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ES _bulk 批量操作用法

    es 的 bulk 操作,是用来批量发送请求,或者理解为批量操作的。 支持4种操作 bulk 支持多种操作,如下 create 、 index 、 update 、 delete 。 create 如果文档不存在就创建,但如果文档存在就返回错误 index 如果文档不存在就创建,如果文档存在就更新 update 更新一个文档,如果文档

    2024年02月03日
    浏览(32)
  • ElasticSearch中批量操作(批量查询_mget、批量插入删除_bulk)

    有时候可以通过批量操作来减少网络请求。如:批量查询、批量插入数据。 当某一条数据不存在,不影响整体响应,需要通过found的值进行判断是否查询到数据。          在Elasticsearch中,支持批量的插入、修改、删除操作,都是通过_bulk的api完成的。 请求格式如下:(

    2024年02月12日
    浏览(37)
  • Elasticsearch学习--索引的批量操作mget、bulk

    1. 基本用法 查询id是1、2的数据 2. 提取index  3. ids的用法 4. 指定source create:不存在则创建,存在则报错 delete:删除文档 update:全量替换或部分更新 index:索引(动词) 1. 自动生成id   2. 删除操作是懒删除 并没有真正的删除,只是标记为删除  3. index(可以是创建,也可以

    2024年02月10日
    浏览(42)
  • 初识ElasticSearch(5) -批量操作之bulk | 条件查询 | 其它查询

    本系列笔记结合HTTP请求(使用postman调用,源文件见GitHub)和ElasticsearchRestTemplate进行调用学习 ElasticsearchRestTemplate封装了RestHighLevelClient,有些场景还得用RestHighLevelClient来操作 版本说明:使用的SpringBoot-2.3.5,对应的ElasticSearch-7.6.2;所以还是可以用RestHighLevelClient ElasticSearch-7

    2023年04月08日
    浏览(61)
  • 【lesson13】MySQL表的基本操作之create(创建),update(更新)和replace(替换)

    CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除) 建表 基础测试 全列插入 指定列插入 注意: 1.指定列插入时一定要按前面指定列的顺序,插入数据,否则就会报错。 2.如果忽略某些列,那么这些列一定要有,默认值或者是自增长的,否则就会报错 3.into 也可以省略

    2024年02月04日
    浏览(44)
  • Elasticsearch Java REST Client 批量操作(Bulk API)

    上一篇:Elasticsearch Java REST Client Term Vectors API 下一篇:Elasticsearch Java REST Client Search APIs 查询 BulkRequest可用于使用单个请求执行多个索引、更新和/或删除操作。 它需要至少一个操作添加到 Bulk 请求中: multiGetAPI 在单个 http 请求中并行执行多个请求get 。 MultiGetRequest,添加 `M

    2024年02月11日
    浏览(40)
  • Elasticsearch的批量bulk 提交 写入的方式会有顺序问题吗?

    Elasticsearch的分布式特性可能会导致写入操作的执行顺序与提交顺序稍有不同。在分布式环境中,Elasticsearch将数据分散到不同的节点上进行存储和处理,因此写入操作的执行顺序可能会受到网络延迟、负载均衡等因素的影响。 根源在于ES的分布式架构。如上图所示,客户端的

    2024年02月03日
    浏览(39)
  • Spring Boot Elasticsearch7.6.2实现创建索引、删除索引、判断索引是否存在、获取/添加/删除/更新索引别名、单条/批量插入、单条/批量更新、删除数据、递归统计ES聚合的数据

    注意:我的版本是elasticsearch7.6.2、spring-boot-starter-data-elasticsearch-2.5.6 引入依赖 有时候你可能需要查询大批量的数据,建议加上下面配置文件

    2024年02月13日
    浏览(52)
  • Django rest_framework Serializer中的create、Views中的create/perform_create的区别

    对于后端来说,前后端分离的方式能让前后端的开发都爽。和所有的爽一样,每爽一次都要付出一定的代价。而前后端分离的代价,就是后端要面对巨量的模块化的功能组件以及这些组件的常规用法与重写复用。有一点经验,关于[Django rest_framework ] Serializer 中的create()、 Vie

    2024年02月13日
    浏览(26)
  • 创建应用通道失败: create channel failed: create channel failed:

    创建应用通道失败: create channel failed: create channel failed: SendEnvelope failed: calling orderer ‘localhost:7050’ failed: Orderer Client Status Code: (2) CONNECTION_FAILED. Description: dialing connection on target [localhost:7050]: connection is in TRANSIENT_FAILURE 这个错误通常是因为客户端无法连接到Orderer节点导致的。一

    2024年02月03日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包