Загрузка CSV в правильный столбец в базу данных в Django
Мне нужна помощь с загрузкой данных из csv в мою модель в Django. У меня есть две модели: Product и Warehouse. И я получаю данные о товаре из таблицы Product в таблицу Warehouse.
Изначально я использовал название продукта в csv файле и данные корректно загружались в таблицу Warehouse. Но мне пришлось добавить лучший ключ EAN в таблицу Product, и теперь, когда я использую EAN в csv, данные о продукте не выгружаются из таблицы Product, но добавляются в таблицу Product и Warehouse из csv как новая запись.
Models.py:
class Product(models.Model):
ean = models.CharField("EAN", max_length=30)
name = models.CharField("Product", max_length=150, null=True, blank=True)
pyear = models.IntegerField("pYear", null=True, blank=True)
drop = models.IntegerField("Drop", null=True, blank=True)
def __str__(self):
return f"{self.ean} - {self.name}"
class Warehouse(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE, null=True, blank=True)
pieces = models.IntegerField("Quantity", null=True, blank=True)
@classmethod
def create_from_csv_line(cls, line):
w = Warehouse()
try:
w.product = Product.objects.get(name=str(line["EAN"]))
except Product.DoesNotExist:
w.product, _ = Product.objects.get_or_create(name=str(line["EAN"]))
w.pieces = int(line["Available"])
w.save()
def __str__(self):
return f"{self.product}, quantity: {self.pieces}
Views.py:
class WarehouseCSVImportView(LoginRequiredMixin, SuccessMessageMixin, FormView):
template_name = "warehouse/warehouse_csv_import.html"
form_class = WarehouseCSVForm
def test_func(self):
return self.request.user.is_superuser
def post(self, request, *args, **kwargs):
form: WarehouseCSVForm = WarehouseCSVForm(request.POST, request.FILES)
if form.is_valid():
csv_file = form.cleaned_data["uploaded_file"]
decoded_file = csv_file.read().decode('utf-8-sig')
io_string = io.StringIO(decoded_file)
reader = csv.DictReader(io_string, delimiter=",", skipinitialspace=True)
record_count = 0
for line in reader:
Warehouse.create_from_csv_line(line=line)
record_count += 1
context = self.get_context_data()
my_text = ' new inventory data uploaded.'
messages.success(request, str(record_count) + my_text)
return render(request, self.template_name, context)
else:
return self.form_invalid(form)
И, наконец, принтскрин моей таблицы Warehouse - первая строка показывает, как она должна выглядеть - колонка EAN с номером и колонка Product с названием.
Во второй строке ниже приведена моя выгрузка из csv, где EAN номер загружается в колонку Product name и, к сожалению, также новый продукт добавляется в таблицу Product с пустой колонкой EAN и EAN номером в колонке product name: