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)

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

相关推荐
m0_595199855 小时前
Django Rest Framework 和 JWT 身份验证
后端·python·django
m***56725 小时前
【玩转全栈】----Django制作部门管理页面
后端·python·django
墨客希14 小时前
Django 学习指南
数据库·django·sqlite
e***582314 小时前
使用Django Rest Framework构建API
数据库·django·sqlite
chushiyunen14 小时前
django第一个项目blog
python·django
s***385614 小时前
【玩转全栈】----Django基本配置和介绍
数据库·django·sqlite
Q_Q5110082851 天前
python+django/flask的宠物用品系统vue
spring boot·python·django·flask·node.js·php
q***72561 天前
vscode配置django环境并创建django项目(全图文操作)
vscode·django·sqlite
梅花141 天前
基于Django的博客系统
后端·python·django·毕业设计·博客·博客系统·毕设