Django: Импорт данных из загруженного файла excel
Я пытаюсь создать приложение для импорта данных из загруженного .csv файла в мою базу данных. Вот к чему мне удалось прийти самостоятельно: файл загружается без проблем, и я могу передать информацию из файла в переменную first_row и second row. Теперь моя проблема заключается в том, как я могу сохранить информацию в базе данных. Мой код представления:
ПРОСМОТРОВ
@login_required
def file_upload(request):
data = None
if request.method == 'POST':
file_form = FileForm(request.POST, request.FILES)
data_form = DatasetForm(request.POST, request.FILES)
raw_file= request.FILES
if file_form.is_valid() or data_form.is_valid():
data = request.FILES['file_upload']
data = pd.read_csv(data, header=0, encoding="UTF-8")
first_row = data.iloc[[0]]
second_row = data.iloc[[1]]
file_form.instance.user = request.user.profile
file_form.instance.filename = raw_file['file_upload'].name
file_form.save()
return redirect('upload_file')
else:
return redirect('home')
else:
form = FileForm()
context = {
'data': data,
'second_row': second_row,
'file_form': file_form,
'message': message,
}
return render(request, 'upload_file.html', context)
Вот как выглядят мои данные и модели: ДАННЫЕ
code tot sd
name_1 aa 3 1
name_2 bb 7 2
МОДЕЛЬ
class File(models.Model):
user = models.ForeignKey(Profile, on_delete=models.CASCADE)
filename = models.CharField(max_length=250)
file_upload = models.FileField(upload_to=path)
upload_date = models.DateField(default=datetime.now)
def __str__(self):
return self.user.name + 'file'
class Dataset(models.Model):
user = models.ForeignKey(Profile, on_delete=models.CASCADE)
file_uploaded = models.OneToOneField(File, on_delete=models.CASCADE)
name_user_A = models.CharField(max_length=250)
code_user_A = models.PositiveIntegerField(null=True)
total_user_A = models.PositiveIntegerField(null=True)
sd_user_A = models.PositiveIntegerField(null=True)
name_user_B = models.CharField(max_length=250)
code_user_B = models.PositiveIntegerField(null=True)
total_user_B = models.PositiveIntegerField(null=True)
sd_user_B = models.PositiveIntegerField(null=True)
ФОРМЫ
class FileForm(forms.ModelForm):
class Meta:
model = File
fields = '__all__'
class DatasetForm(forms.ModelForm):
class Meta:
model = Dataset
fields = '__all__'
В основном мне нужно сохранить первую строку в поле для пользователя_A и вторую строку для пользователя_B. Только модель File составляется пользователем, а Dataset должен заполняться автоматически из информации в файле. Как я могу это сделать? Спасибо всем! PS (Мне пришлось внести некоторые изменения, чтобы сделать его короче и понятнее, может быть несколько опечаток, но он действительно работает)
Если вы импортируете модель Dataset, вы можете создать новый объект на основе данных, которые вы уже получили из файла.
например:
#import your model
from . models import Dataset
@login_required
def file_upload(request):
data = None
if request.method == 'POST':
file_form = FileForm(request.POST, request.FILES)
data_form = DatasetForm(request.POST, request.FILES)
raw_file= request.FILES
if file_form.is_valid() or data_form.is_valid():
data = request.FILES['file_upload']
data = pd.read_csv(data, header=0, encoding="UTF-8")
first_row = data.iloc[[0]]
second_row = data.iloc[[1]]
# create new dataset object
Dataset.objects.create(
name_user_A=first_row,
name_user_B=second_row,
...,
...)