Объединить данные модели со списком объектов - PullRequest
0 голосов
/ 21 ноября 2010

У меня есть список объектов:

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)

Проблема в том, что я не уверен, что я мог бы заменить их? чтобы получить объект, затем имя для каждого объекта в списке. Должен ли я использовать цикл вместо? Какой вариант наиболее предпочтителен?

1 Ответ

1 голос
/ 21 ноября 2010

Чтобы избежать многократного обращения к базе данных, я рекомендую использовать метод in_bulk queryset. Он принимает список идентификаторов и возвращает словарь идентификаторов, сопоставленных с экземпляром модели. Итак, вам нужно сначала просмотреть список словарей, чтобы извлечь значения идентификаторов, затем выполнить запрос, а затем снова пройти, чтобы получить имя для каждого экземпляра. Несмотря на то, что для этого нужно выполнить две дополнительные итерации, это все равно должно быть быстрее, чем выполнение нескольких запросов к БД (хотя, как всегда, вам следует выполнить профилирование, чтобы убедиться в этом).

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...