如果我从以下命令创建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}]>
是否可以使用data
从ModelB
内的每个哈希创建QuerySet
个对象?
我意识到我可以迭代并解压缩QuerySet
并按照这样做:
for q in data:
ModelB.objects.create(date=q['date'], total=q['total'], average=q['average'])
但是有更优雅的方式吗?当它们几乎处于bulk_create
格式时,迭代和创建似乎是多余的。
答案 0 :(得分:5)
这比你的调用更有效,因为它使用bulk_create
,它只调用一个SQL批量创建操作,而不是每个对象创建一个;而且,它更优雅:
ModelB.objects.bulk_create([ ModelB(**q) for q in data ])
关于这是如何工作的,双星号将字典(或类字典对象)解压缩为Python函数的关键字参数。