Django带外键关联的模型如何实现高效批量创建数据
Django Image 模型高效批量插入方案
优化核心思路
- 消除冗余查询:你的
Item模型使用自定义的item_id作为主键,原始数据中已经持有该值,构造Image实例时可直接指定外键IDitem_id,无需提前查询Item对象 - 批量插入替代单条插入:和
Item的插入逻辑一致,使用bulk_create批量写入Image数据,大幅减少数据库IO次数
实现代码
from itertools import islice from django.db import transaction # 可根据实际场景调整批次大小,SQLite环境建议设置为1000~5000 BATCH_SIZE = 2000 # 开启事务进一步提升写入性能 with transaction.atomic(): # 构造Image实例生成器,不占用额外内存 image_iter = ( Image( item_id=item['id'], image_url=image['urls']['big'] ) for item in items for image in item['images'] ) # 分批插入 while True: batch = list(islice(image_iter, BATCH_SIZE)) if not batch: break Image.objects.bulk_create(batch, BATCH_SIZE)
性能提升说明
原有实现的性能开销主要来自两部分:每遍历一个Item就执行1次SELECT查询,每插入一张图片执行1次INSERT查询,数据量大时SQL执行次数会达到十万甚至百万级。优化后仅需执行个位数到几十次INSERT查询,无任何SELECT开销,SQLite环境下插入速度可提升几十到上百倍。
内容的提问来源于stack exchange,提问作者polaupa
相关产品推荐
相关产品推荐

