django之bulk_create

在 Django 中,批量创建对象可以显著提高性能,特别是在需要创建大量对象时。Django 提供了 bulk_create 方法来实现这一点。

假设的模型

首先,假设有一个简单的模型 Book,包含书名和作者字段。

python 复制代码
# models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=100)

    def __str__(self):
        return self.title

批量创建对象

接下来使用 bulk_create 方法批量创建 Book 对象

python 复制代码
# views.py 或者在 Django shell 中
from myapp.models import Book

# 创建一个包含多个 Book 对象的列表
books = [
    Book(title='Book 1', author='Author 1'),
    Book(title='Book 2', author='Author 2'),
    Book(title='Book 3', author='Author 3'),
    # 可以继续添加更多的 Book 对象
]

# 使用 bulk_create 方法批量创建对象
Book.objects.bulk_create(books)

注意事项

  1. 性能bulk_create 方法在单个 SQL 查询中插入所有对象,这比逐个保存对象要快得多。
  2. 返回值bulk_create 方法不会返回创建的对象列表。如果你需要获取创建的对象,可以在创建后重新查询数据库。
  3. 限制:某些数据库(如 SQLite)对单个插入查询的大小有限制。如果你需要插入非常大量的数据,可能需要分批次进行。

分批次批量创建

如果需要插入非常大量的数据,可以分批次进行批量创建:

python 复制代码
# views.py 或者在 Django shell 中
from myapp.models import Book
from django.db import transaction

# 创建一个包含多个 Book 对象的列表
books = [
    Book(title='Book 1', author='Author 1'),
    Book(title='Book 2', author='Author 2'),
    Book(title='Book 3', author='Author 3'),
    # 可以继续添加更多的 Book 对象
]

# 定义每批次的大小
batch_size = 1000

# 分批次批量创建对象
for i in range(0, len(books), batch_size):
    with transaction.atomic():
        Book.objects.bulk_create(books[i:i + batch_size])

或者

python 复制代码
from myapp.models import Book
from django.db import transaction

# 创建一个包含多个 Book 对象的列表
books = [
    Book(title='Book 1', author='Author 1'),
    Book(title='Book 2', author='Author 2'),
    Book(title='Book 3', author='Author 3'),
    # 可以继续添加更多的 Book 对象
]

# 使用 bulk_create 方法批量创建对象,并指定 batch_size
with transaction.atomic():
    Book.objects.bulk_create(books, batch_size=1000)

通过这种方式,你可以确保所有的插入操作在一个事务中执行,从而保证数据的一致性。

相关推荐
百锦再2 小时前
低代码开发的约束性及ABP框架的实践解析
android·开发语言·python·低代码·django·virtualenv·rxjava
小宁爱Python6 小时前
从零搭建 RAG 智能问答系统 6:Text2SQL 与工作流实现数据库查询
数据库·人工智能·python·django
言德斐1 天前
Python Web框架深度对比:Django vs Flask vs FastAPI(含优缺点与选型策略)
前端·python·django
belldeep1 天前
python:怎样用 Django 开发电子商务程序
django·电子商务·1024程序员节
清静诗意1 天前
【Django FilterSet 深入解析】类属性过滤器与 Meta.fields 的关系详解(附源码分析)
django·filter
大叔_爱编程1 天前
基于随机森林算法的Boss直聘数据分析及可视化-hadoop+django+spider
hadoop·django·1024程序员节·spider·随机森林算法·boss直聘
白小筠2 天前
创建Django项目
数据库·django·sqlite
计算机毕业设计小帅2 天前
【2026计算机毕业设计】基于Django的社区婴幼儿预防接种系统
数据库·django·课程设计
麦麦大数据3 天前
D027 v2 vue+django+neo4j 基于知识图谱红楼梦问答系统 (新增问关系功能;新增知识节点和关系管理功能,neo4j增删改查功能)
vue.js·django·问答系统·知识图谱·neo4j·图谱管理·neo4j增删改查
不爱搬砖的码农3 天前
宝塔面板部署Django:使用Unix Socket套接字通信的完整教程(附核心配置与问题排查)
python·django·unix