Как импортировать базу данных из файла csv в django?
В моем webapp мне нужно разместить страницу, где пользователь может создать базу данных из загруженного файла csv. Я пытаюсь сделать это, используя def, как это сделано здесь https://docs.djangoproject.com/en/4.1/topics/http/file-uploads/, но, не работает.
Я полагаю, что модели работают успешно, потому что другие формы.
forms.py
class FileFieldForm(ModelForm):
title = forms.CharField(max_length=50)
file = forms.FileField()
class Meta:
model = Colecao
fields = '__all__'
views.py
class ColecaoCSVCreate(CreateView):
login_url = reverse_lazy('login')
form_class = FileFieldForm
template_name = 'formulario/formulario_csv.html'
success_url = reverse_lazy('listar_colecao')
def post(self, request,*args,**kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
files = request.FILES['sent_file']
if form.is_valid():
for f in files:
reader = csv.DictReader(io.StringIO(f.read().decode('utf-8')))
data = [line for line in reader]
return self.form_valid(form)
else:
return self.form_invalid(form)
formulario_csv.html
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="sent_file"/>
{% if request.user.is_authenticated %}
<button type="submit" class="btn btn-outline-primary">Confirmar</button>
{% endif %}
<a href="/listar/colecao/">
<button type="button" class="btn btn-outline-danger">Cancelar</button>
</a>
</form>
Когда я загружаю csv, возникает ошибка MultiValueDictKeyError в /cadastrar/csv/colecao/ 'sent_file'
Вы можете прочитать CSV файл с помощью pandas и преобразовать каждую строку в dict:
import pandas as pd
df = pd.read_csv('your path file')
dict_df = df.to_dict(orient='records')
и позже вы можете использовать метод 'super' для экземпляра каждого элемента dict и сохранения в db:
сначала измените метод "init":
class FileFieldForm(ModelForm):
title = forms.CharField(max_length=50)
file = forms.FileField()
class Meta:
model = Colecao
fields = '__all__'
def __init__(self, my_dict):
for key in my_dict:
setattr(self, key, my_dict[key])
и теперь вы можете инициализировать ваш объект и сохранить, например:
for my_dict in dict_df:
element = FileFieldForm(my_dict)
element.save()