Django使用优化的方法和最少的资源读取json并获取数据以批量创建

问题描述

基本上我想知道我是否可以以某种方式使用单个for循环来完成任务

我是python的新手,我正在学习实现知识的有效方法

这是当前情况

json_dict = {
   items: [
   {'uuid': 'some uuid','quantity': 2},{'uuid': 'some uuid','quantity': 3},'quantity': 4}]
}

我正在接收此json,并且必须进行查询以根据提供的uuid来获取这些项目中的每一项。提取这些项目后,我必须在与此模型相关的另一个模型中创建它们的条目。

我的方法是通过for循环将uuid和数量分成两个单独的列表

   for item in json:
        item_uuids.append(item['uuid'])
        item_quantities.append(item['quantity'])

获取项目对象

 q = Q()
 [q.add(Q(uuid=uuid),Q.OR) for uuid in item_uuids]
 items = model.objects.filter(q)

然后进行列表理解

 item_objs = []
 [item_objs.append(ItemModel(uuid=uuid,quantity=quantity)) for uuid,quantity in zip(items,item_quantities)]    

然后,我进行了最后一个查询

ModelA.objects.bulk_create(item_objs)

是否有任何有效的方法来实现这一目标,因为它一直困扰着我,我在这里可能会采用错误的方法。 任何帮助将非常感激。 预先感谢

解决方法

您没做错,但可能有点复杂。 如果您是我,我将首先使用给定的JSON创建字典,dictionary是您可以使用的最快的类型之一。 您必须更改json变量名,因为有一个名为json的内置模块。

json_items = {i.get('uuid'): i for i in _json}

然后对于控制数据库,如果存在给定的uuid列表:

exist_uuid_list = list(model.objects.filter(uuid__in=json_items.keys()).values_list('uuid',flat=True))

它仅从db获取uuid列表。如果values_list已调用,那么它只是从db获取给定字段,而不是所有其他字段,那么这是最快的方法。

然后批量创建:

model.objects.bulk_create([model(**item) for uuid,item in json_items.items() if uuid not in exist_uuid_list])

实际上,只有从数据库中获取现有的uuid才能改善。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...