Получение значений .csv без сохранения

Сейчас я загружаю .csv файл через форму модели, сохраняю его в модели, а затем читаю/сохраняю все значения из .csv в другой модели.

После получения всех значений в другой модели .csv не нужен, поэтому я пытался найти способ просто прочитать .csv и получить значения без сохранения в модели.

Ниже приведены основы моей точки зрения.

Буду признателен за любые советы.


def ncaab_csv(request):

    form = CsvUpload(request.POST or None, request.FILES or None)

    if request.method == "POST":
        if form.is_valid():
            form.save()
        
            # Get the submitted csv file
            games_file = Csv.objects.get(games_entered=False)

            with open(games_file.file_name.path, 'r') as f:
                reader = csv.reader(f)

                for i, row in enumerate(reader):
                    if i == 0:
                        pass
                    else:
                        try:
                            game = NCAABGame.objects.get(name__name=row[1],
                                                         updated=False,
                                                         date=today)

                            All NCAABGame fields here...
                            
                            game.save()

            return redirect(reverse('ncaab_games'))

        else:
            messages.error(request, "Failed to save file.")
    else:
        template = 'management/ncaab/ncaab_csv.html'

    context = {
        'form': form,
    }

    return render(request, template, context)

Я нашел решение, размещаю для тех, кто еще ищет способ.

Я создал form.Form и FormView, затем обработал .csv в моем forms.py.

forms.py

    import io
    import csv

    class CsvUpload(forms.Form):
        data_file = forms.FileField()

        def process_data(self):

            f = io.TextIOWrapper(self.cleaned_data['data_file'].file)
            reader = csv.DictReader(f)

            for row in reader:
                game = NCAABGame.objects.get(
                        name__name=row['name'], updated=False, date=today)
                game.field_goals = row['field_goals']
                game.fg_attempts = row['fg_attempts']

                More data saved to NCAABGame model...

                game.save()
views.py

    from django.views.generic.edit import FormView

    class CsvView(FormView):
        template_name = 'management/ncaab/ncaab_csv.html'
        form_class = CsvUpload
        success_url = '/management/ncaab_games/'

        def form_valid(self, form):
            form.process_data()
            messages.success(self.request, 'Successfully processed games!')
            return super().form_valid(form)
.html

    <form method="post">
    {% csrf_token %}
        {{ forms.form.as_p }}
        <input type="submit" value="submit"/>
    </form>
Вернуться на верх