Django从QuerySet批量创建对象

时间:2017-12-29 02:22:19

标签: python django django-queryset

如果我从以下命令创建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}]>

是否可以使用dataModelB内的每个哈希创建QuerySet个对象?

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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