Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将模型数据与对象列表相结合_Python_Django_Zip - Fatal编程技术网

Python 将模型数据与对象列表相结合

Python 将模型数据与对象列表相结合,python,django,zip,Python,Django,Zip,我有一个对象列表: 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'},
           {'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循环吗?最好的选择是什么?

为了避免多次命中数据库,我建议您使用
in_bulk
queryset方法。这将获取ID列表,并返回映射到模型实例的ID字典。因此,您需要做的是首先运行字典列表以提取ID值,然后执行查询,然后再次运行以获取每个实例的名称。即使这需要进行两次额外的迭代,它也应该比运行多个DB查询更快(尽管您应该一如既往地进行配置以确保)


我一定会在某个时候找到批量使用的方法。在这个例子中,我不知道迭代两次是否有意义。看起来我们可以一次完成,当然这取决于你,但是你不应该只关注迭代,因为它是主要的低效。多次单独访问数据库效率要低得多。运行
ab
对我的代码与上面aaronsterling的代码进行100次点击的快速测试显示,我的代码的点击率为0.370ms,而他的代码的点击率为0.542ms:因此,我的方法的效率大约提高了50%。你说得对。测试它,这确实工作得更快。谢谢你的跟进。
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