Загрузка 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:

Crispy Table of Warehouse Model

Вернуться на верх