我有一个对象列表:
film_hc = [{'count': 2, 'pk': '33'},
{'count': 1, 'pk': '37'},
{'count': 1, 'pk': '49'}]
'pk'值是模型中记录的主键。我想将该记录的名称字段添加到此对象列表中。要得到一个名字,我可以使用:
record = Film.objects.get(pk = film_hc[0]['pk'])
record.name
最后,我想有这样的事情:
film_hc = [{'count': 2, 'pk': '33', 'name': 'name1'},
{'count': 1, 'pk': '37', 'name': 'name2'},
{'count': 1, 'pk': '49', 'name': 'name3'}]
问题:将必要数据附加到此预先存在的列表的最有效方法是什么?
我在想我可以使用zip功能:
film_hc_with_names = zip(????, film_hc)
问题是我不确定我会替代那些????获取对象然后是列表中每个对象的名称。我应该使用for循环吗?什么是最优选的选择?
答案 0 :(得分:1)
为避免多次访问数据库,我建议您使用in_bulk
queryset方法。这将获取ID列表,并返回映射到模型实例的ID字典。因此,您需要做的是首先运行您的字典列表以提取ID值,然后执行查询,然后再次运行以获取每个实例的名称。即使这是两次额外的迭代,它仍然应该比运行多个数据库查询更快(尽管你应该总是要进行分析以确保)。
id_list = [film['id'] for film in film_hc]
objects = Film.objects.only('name').in_bulk(id_list)
for film in film_hc:
film['name'] = objects[film['id']].name