【问题标题】:Django bulk create objects from QuerySetDjango 从 QuerySet 批量创建对象
【发布时间】:2018-06-09 13:02:44
【问题描述】:

如果我通过以下命令创建了QuerySet

data = ModelA.objects.values('date').annotate(total=Sum('amount'), average=Avg('amount'))
# <QuerySet [{'date': datetime.datetime(2016, 7, 15, 0, 0, tzinfo=<UTC>), 'total': 19982.0, 'average': 333.03333333333336}, {'date': datetime.datetime(2016, 7, 15, 0, 30, tzinfo=<UTC>), 'total': 18389.0, 'average': 306.48333333333335}]>

是否可以使用dataQuerySet 中的每个哈希创建ModelBobjects?

我意识到我可以迭代并解压缩 QuerySet 并这样做:

   for q in data:
        ModelB.objects.create(date=q['date'], total=q['total'], average=q['average'])

但是还有更优雅的方式吗?当它们几乎采用bulk_create 格式时,迭代和创建似乎是多余的。

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    这比您的调用更有效,因为它使用bulk_create,它只调用一次 SQL 批量创建操作,而不是每个对象一次创建;而且,它更优雅:

    ModelB.objects.bulk_create([ ModelB(**q) for q in data ])
    

    至于这是如何工作的,双星号将字典(或类似字典的对象)解压缩为 Python 函数的关键字参数。

    官方 Django 文档:https://docs.djangoproject.com/en/3.2/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create

    【讨论】:

    • 我认为这样会更有效率,因为在 for-loop 'create' 中会触发每个元素的保存,但是对于 bulk_create 将只有一个 sql;
    猜你喜欢
    • 2011-04-06
    • 2011-03-24
    • 2017-10-19
    • 1970-01-01
    • 2020-03-14
    • 2012-03-31
    • 2016-03-12
    • 1970-01-01
    • 2020-10-31
    相关资源
    最近更新 更多