У меня есть функция для пользователей, которая выполняет нечастую загрузку csv своих данных, возможно, включающую около 200 записей и 80 полей, возможно, запись в области 6000 объектов базы данных django.
Я хочуПозвольте им просматривать данные, поэтому у меня есть следующий код (сокращенный здесь с elipses ...) в views.py:
@login_required
def import_assessments(request):
import csv
if request.method == 'POST':
form = AssessmentUploadForm(request.POST, request.FILES)
if form.is_valid():
# handle standard form fields
year = int(request.POST['date_year'])
...
# handle uploaded .csv file
reader = csv.reader(request.FILES['file_upload'])
data = csv.DictReader(request.FILES['file_upload'])
# make some empty lists
unmatched_pupils = []
pupil_tuples = []
csv_errors = []
# make a list of included objectives, derived from column headings
...
# handle the pupil data rows
for row in data:
# build a list of objective,assessment tuples for this pupil
assessments_list = []
for string in objective_strings:
theobjective = included_objectives[string]
assessments_list.append((theobjective, row[string]))
# look the pupil up, and in any case add this new tuple to the pupil's results
firstname = row["First name"]
surname = row["Surname"]
tutor_group = row["Tutor group"]
try:
if tutor_group:
thepupil = Pupil.objects.get(firstname__iexact = firstname, surname__iexact = surname, tutor_group__iexact = tutor_group)
else:
thepupil = Pupil.objects.get(firstname__iexact = firstname, surname__iexact = surname)
except Pupil.DoesNotExist:
unmatched_pupils.append(
(
(firstname,surname,tutor_group),
assessments_list
))
...
else:
pupil_tuples.append(
(
thepupil,
assessments_list
))
# now create errors
if unmatched_pupils:
if len(unmatched_pupils) >=2:
themessage = 'The following pupils could not be identified in the database:'
else:
themessage = 'The following pupil could not be identified in the database:'
csv_errors.append({
'type': 'unmatched_pupils',
'class': 'error',
'message': themessage,
'offenders': unmatched_pupils,
'instruction': 'Check for typing errors in the name or tutor group. If pupils are new, you can add them individually, or import whole year groups using the links below.',
})
...
# render a preview page
return render_to_response('import_preview.html', locals(), context_instance=RequestContext(request))
else:
form = AssessmentUploadForm(request.POST)
else:
form = AssessmentUploadForm()
return render_to_response('assessments_upload.html', locals(), context_instance=RequestContext(request))
Моя реальная функция просмотра немного длиннее (163 строки), с дополнительным кодомпроверить наличие множества возможных совпадений учеников и всевозможных опечаток и случайных повторений в заголовках столбцов CSV.Поскольку ни одна из этих ошибок не является формой, я доставляю их в файл import_preview.html, упакованный в список csv_errors
, где они представлены с рекомендациями.
Если ошибок нет, на странице предварительного просмотра отображаетсятаблица данных, все упаковано в pupil_tuples
.Мой следующий шаг - добавить ссылку / кнопку, чтобы сохранить все это в базе данных.Устаревшая строка кода, которую я использовал при первом тестировании этой загрузки (до того, как я ввел всю проверку ошибок), была:
Assessment.objects.get_or_create(objective=theobjective, pupil=thepupil, teacher=theteacher, status=status, date=thedate)
Я хочу знать, какой должна быть схема всего этого.Все мои данные упакованы в список pupil_tuples
, и я просто хочу его get_or_create
, но я должен использовать ссылку на новую функцию просмотра, новую форму, некоторый код if request.method == 'POST'
?
PS Также мне действительно нужно было загружать и csv.reader, и csv.DictReader отдельно?Это проблема ресурса?Я хочу перебрать все заголовки в виде списка, чтобы проверить наличие дубликатов, что я не думаю, что DictReader позволит мне сделать.Но тогда я хочу использовать все удобства DictReader для остальной части моего зрения.