Django csv import Предварительный просмотр - PullRequest
0 голосов
/ 10 января 2012

У меня есть функция для пользователей, которая выполняет нечастую загрузку 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 для остальной части моего зрения.

...