Проблема не в «сохранении результатов функции», а в «сохранении списка экземпляров модели». Они напрямую не сериализуются.
Лучше всего сохранить только идентификаторы:
result = someFunction()
request.session['result'] = [item.id for item in result]
затем, когда вам нужно вернуть их, извлеките элементы из идентификаторов, либо по отдельности, чтобы соблюсти порядок:
result = [Choice1.objects.get(id) for id in request.session.get('result', [])]
или получите их за один раз и отсортируйте по списку:
ids = request.session.get('result', [])
items = Choice1.objects.filter(id__in=ids)
result = sorted(items, key=lambda item: ids.index(item.id))
Редактировать
Вам необходимо проверить, содержит ли сессия результат, если не получить новый.
result_ids = request.session.get('result')
if result_ids:
# if we have IDs, get the matching items and use them
items = Choice1.objects.filter(id__in=result_ids)
result = sorted(items, key=lambda item: ids.index(item.id))
else:
# otherwise, get new ones and store them
result = someFunction()
request.session['result'] = [item.id for item in result]
return render(request, 'project/template.html', {'resulting': result})