问题描述
基本上我想知道我是否可以以某种方式使用单个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才能改善。