Это определенно не хороший способ хранения Answer
с навалом, так как:
- вы каждый раз выбираете объект
Item
для каждого вопроса;
- ваш код не правильно обрабатывает случай, когда элемент отсутствует: в этом случае он вызовет исключение, а промежуточное программное обеспечение Django (вероятно) отобразит 500 страниц; и
- будет сделано несколько вызовов для создания всех этих объектов.
Мы можем создавать объекты в больших объемах, чтобы уменьшить количество запросов. Как правило, мы создаем все элементы с помощью одного запроса, хотя в зависимости от базы данных и объема данных может потребоваться ограниченное количество запросов.
Более того, нам не нужно извлекать связанные Item
объекты, на всех , мы можем просто установить поле item_id
вместо "двойника" item
ForeignKey
поле, например:
из django.db import IntegrityError
try:
answers = [
Answer(<b>item_id=key</b>, answer=value, user=request.user)
for key, value in request.POST.items()
if key != 'csrfmiddlewaretoken'
]
Answer.objects.<b>bulk_create</b>(answers)
except IntegrityError:
return render(request, 'survey/error.html')
bulk_create
, таким образом, вставит все объекты в небольшое количество запросов и, таким образом, значительно сократит время запроса.
Обратите внимание, что bulk_create
имеет некоторые ограничения (перечисленные на странице документации). Может быть полезно прочитать их внимательно и принять их во внимание. Хотя я думаю, что в данном случае они не актуальны, всегда лучше знать ограничения инструментов, которые вы используете.