美文网首页
django源码之bulk_update中生成器的应用

django源码之bulk_update中生成器的应用

作者: Katou_Megumi | 来源:发表于2022-01-06 14:09 被阅读0次

django的orm提供bulk_update批量更新记录的方法,
bulk_update(self, objs, fields, batch_size=None)
这里有个batch_size参数,作用是在待更新的objs数量过大时,提供分批更新的功能。

那么是怎么实现的呢?
很容易想到的是,对objs进行切片,每次取batch_size大小,然后对每个切片循环添加到update数组里。
那么django的源码是怎么做的呢?
我们在django\db\models\query.py中可以看到:

 def bulk_update(self, objs, fields, batch_size=None):
        """
        Update the given fields in each of the given objects in the database.
        """
        ······
        ······
        max_batch_size = connections[self.db].ops.bulk_batch_size(['pk', 'pk'] + fields, objs)
        batch_size = min(batch_size, max_batch_size) if batch_size else max_batch_size
        requires_casting = connections[self.db].features.requires_casted_case_in_updates
        batches = (objs[i:i + batch_size] for i in range(0, len(objs), batch_size))
        updates = []
        for batch_objs in batches:
        ······
            updates.append(([obj.pk for obj in batch_objs], update_kwargs))
        ······

这里最核心的代码是这一句:
batches = (objs[i:i + batch_size] for i in range(0, len(objs), batch_size))
初看这段代码有点奇怪,这里是怎么实现分批更新的呢,就在这里,这里batches是一个生成器generator
只需要把一个列表生成式的[]改成()就可以创建一个生成器,这样我们无需把完整的objs按照batch_size分割成一个个切片执行update,而是直接对batches循环就可以源源不断生成list。

我们在遇到类似场景时可以借鉴这种技巧。

相关文章

  • django源码之bulk_update中生成器的应用

    django的orm提供bulk_update批量更新记录的方法,bulk_update(self, objs, ...

  • Django基础:drf 源码视图解析

    Django 与drf 源码视图解析 一.原生Django CBV 源码分析:View 二.drf CBV 源码分...

  • Django Rest Framework 源码解析

    Django Rest Framework 源码解析 1、django-rest-framework源码中到处都是...

  • django安装

    下载Django源码包 解压源码包 或者使用下载git代替上面两步 命令行安装Django 查看django版本 ...

  • django middleware

    参考:Django 源码学习(3)——中间件Django Middleware官方文档Django==2.0.4源...

  • django入门学习

    django官网 安装 官方安装方法 源码安装下载源码然后 到django目录下 运行 pip install -...

  • python 生成器小结

    作者:邵正将 来源:PytLab 在python中生成器可以很方便的实现迭代协议。生成器通过生成器函数产生,生成器...

  • Django的一些学习demo说明

    Web框架之Django: (1)简介: Django是一个由Python写成开源的重量级Web应用框架,采用MT...

  • koa2.x学习3

    Koa 应用生成器以及 Koa 路由模块化 Koa 应用生成器Koa 搭建模块化路由/层级路由 Koa 应用生成器...

  • Django:web框架的学习(1)

    概念 Django:是什么?是一个开放源码的web应用框架,由python编写,采用MVC的软件设计模式用途:简化...

网友评论

      本文标题:django源码之bulk_update中生成器的应用

      本文链接:https://www.haomeiwen.com/subject/menlcrtx.html