将模型数据与对象列表组合在一起

时间:2010-11-21 06:54:03

标签: 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', 'name': 'name1'},
           {'count': 1, 'pk': '37', 'name': 'name2'},
           {'count': 1, 'pk': '49', 'name': 'name3'}]

问题:将必要数据附加到此预先存在的列表的最有效方法是什么?

我在想我可以使用zip功能:

film_hc_with_names = zip(????, film_hc)

问题是我不确定我会替代那些????获取对象然后是列表中每个对象的名称。我应该使用for循环吗?什么是最优选的选择?

1 个答案:

答案 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